无法从 ArrayList<Parcelable> 强制转换为 ArrayList<ClSprite>
在我写的一段代码中,我有这样一行:
AllSprites = (ArrayList<ClSprite>) savedInstanceState.getParcelableArrayList("AllSprites");
我收到有关从 到 的无效强制转换的错误。为什么这不合法?ArrayList<Parcelable>
ArrayList<ClSprite>
在我写的一段代码中,我有这样一行:
AllSprites = (ArrayList<ClSprite>) savedInstanceState.getParcelableArrayList("AllSprites");
我收到有关从 到 的无效强制转换的错误。为什么这不合法?ArrayList<Parcelable>
ArrayList<ClSprite>
一个简单的解决方案是像这样设置返回的元素类型
ArrayList<ClSprite> AllSprites = savedInstanceState.<ClSprite>getParcelableArrayList("AllSprites")
其他人已经解释了这个问题,但是在这种情况下,有一个非常简单的解决方案。只需离开强制转换,您的代码就会编译。:) :
ArrayList<ClSprite> AllSprites = savedInstanceState.getParcelableArrayList("AllSprites");
为什么?
看看方法的签名:getParcelableArrayList
public <T extends Parcelable> ArrayList<T> getParcelableArrayList(String key)
它是一个泛型方法,其类型参数必须是 的子级。如果直接将其赋给类似如下的变量:Parcelable
ArrayList<ClSprite> AllSprites; // declaration somewhere
// ClSprite implements Parcelable
...
AllSprites = savedInstanceState.getParcelableArrayList("AllSprites");
编译器可以推断出类型参数,因此根本不需要强制转换!推导后,签名将如下所示:
public ArrayList<ClSprite> getParcelableArrayList(String key)
很明显,我们不必从 到 。:)ArrayList<ClSprite>
ArrayList<ClSprite>
但是为什么会出现此错误?如果执行强制转换而不将变量直接赋给此方法的返回值,则编译器无法推断出 type 参数,它只知道返回的类型为 。在这种情况下,错误发生在其他人已经解释过的事情上。ArrayList<Parcelable>
此外,如果该方法不是通用的,但如下所示:
public ArrayList<Parcelable> getParcelableArrayList(String key)
您无法将返回值赋值给 ,因为根本没有类型推断,并且无法从 转换为 。尽管这是有道理的,但Java对泛型使用类型擦除,并使这些事情在运行时不安全。AllSprites
ArrayList<Parcelable>
ArrayList<ClSprite>