2

我正在关注有关内容提供者的教程,并且在特定代码中,他们使用一种bulkInsert方法插入了一些数据。他们还使用 Vector 变量 ( cVVector) 来存储所有ContentValues.

提到的代码:

if (cVVector.size() > 0) {
   ContentValues[] cvArray = new ContentValues[cVVector.size()];
   cVVector.toArray(cvArray);
   mContext.getContentResolver().bulkInsert(WeatherEntry.CONTENT_URI, cvArray);
}

然后,我尝试通过强制转换为 来减少代码cVVector.toArray()ContentValues[]但出现错误。

我编辑的代码:

if (cVVector.size() > 0) {
   mContext.getContentResolver().bulkInsert(WeatherEntry.CONTENT_URI, (ContentValues[]) cVVector.toArray());
}

我得到的错误:

FATAL EXCEPTION: AsyncTask #1
Process: com.example.thiago.sunshine, PID: 9848
java.lang.RuntimeException: An error occured while executing doInBackground()
...
Caused by: java.lang.ClassCastException: java.lang.Object[] cannot be cast to android.content.ContentValues[]

最后,我的问题是:为什么我不能在 anObject[]和 a之间进行转换ContentValues[]

Obs.: 英文不是我的母语,如有错误请见谅。

4

1 回答 1

3

您不能强制Object[]转换为ContentValues[],因为这两种类型之间没有关系。它们是不同的数组类型。

就像您可以将 anObject转换为String这样的:

Object a = "aa";
String b = (String) a;

因为String是 的子类Object

但你不能这样做:

Object[] ar = new Object[]{"aa", "bb"};
String[] br = (String[]) ar;

你会发现这在编译时是可以的,但在运行时就不行了。JAVA 中的强制类型转换可能只适用于单个对象而不是数组。

您可以将代码替换为:

if (cVVector.size() > 0) {
   mContext.getContentResolver().bulkInsert(WeatherEntry.CONTENT_URI, (ContentValues[]) cVVector.toArray(new ContentValues[1]));
}

希望这可以帮到你。

于 2016-08-06T03:58:39.883 回答