我不明白为什么会发生这种ClassCastException

// Application ...
Intent i = new Intent();
i.putExtra(EXTRA_FILE_UPLOAD_URIS, mGalleryAdapter.getItems()); 

Uri[] getItems() { return mItems; }

// Service ...
intent.getParcelableArrayExtra(EXTRA_FILE_UPLOAD_URIS); //works, returns Parcelable[]
Uri[] uris = (Uri[])intent.getParcelableArrayExtra(EXTRA_FILE_UPLOAD_URIS);
// ... Breaks with ClassCastException

为什么施法要打破,什么时候是?Uri[]UriParcelable


答案 1

使用这种方法,它对我有用。

Parcelable[] ps = getIntent().getParcelableArrayExtra();
Uri[] uri = new Uri[ps.length];
System.arraycopy(ps, 0, uri, 0, ps.length);

答案 2

不幸的是,对于 中的数组,没有办法像这样转换。您必须迭代数组并单独转换每个对象。Java

这样做的原因是安全类型,根本无法确保数组的内容可以转换为Uri,而不必通过它们进行迭代,这就是为什么您必须迭代它们并单独转换它们的原因。JVM

基本上,因为可以由其他对象继承,所以不能保证数组只包含对象。但是,转换为超类型将起作用,因为从那时起,类型安全性就可以了。ParcelableUri