无法从 ArrayList<Parcelable> 强制转换为 ArrayList<ClSprite>

2022-09-04 23:47:23

在我写的一段代码中,我有这样一行:

         AllSprites = (ArrayList<ClSprite>) savedInstanceState.getParcelableArrayList("AllSprites");

我收到有关从 到 的无效强制转换的错误。为什么这不合法?ArrayList<Parcelable>ArrayList<ClSprite>


答案 1

一个简单的解决方案是像这样设置返回的元素类型

ArrayList<ClSprite> AllSprites = savedInstanceState.<ClSprite>getParcelableArrayList("AllSprites")


答案 2

其他人已经解释了这个问题,但是在这种情况下,有一个非常简单的解决方案。只需离开强制转换,您的代码就会编译。:) :

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对泛型使用类型擦除,并使这些事情在运行时不安全。AllSpritesArrayList<Parcelable>ArrayList<ClSprite>


推荐