Java - Cast ArrayList Up Hierarchy

时间:2012-06-06 19:30:38

标签: java casting polymorphism

我有一个简单的类结构:

class BaseModel {}

class Performer extends BaseModel {}

我收集了Performer s:

ArrayList<Performer> list = loadPerformerList();

为什么我不能这样做?

functionThatNeedsArrayOfBase( (ArrayList<BaseModel>)list );

或者,我该如何正确地做到这一点?

5 个答案:

答案 0 :(得分:10)

的集合不是基础的集合。否则,您可以将基础对象添加到子集合中,从而打破假设(同样反过来)。

您可以将函数的参数指定为包含base的衍生的列表:

void functionThatNeedsArrayOfBase(ArrayList<? extends BaseModel> list) {
  //...
}

然后你可以通过list而无需投射

答案 1 :(得分:2)

试试这个:<? extends BaseModel>,它没有说明BaseModel的哪个子类只是一个特定的。另请参阅<? super BaseModel>,具体取决于您的需求。

答案 2 :(得分:1)

list是Performer的ArrayList。 如果java允许你将其强制转换为ArrayList<BaseModel>,那么当时的列表中只包含BaseModel(s)当一个Performer添加到不是BaseModel的列表时会发生什么?如果我们允许的话,我们会失去类型安全。

答案 3 :(得分:1)

问题是ArrayList的类型安全性。您可以在StackOverflow Post找到更详细的解释。简而言之,解决此问题的方法是让方法接受类型为<? extends/super Performer>的类。

答案 4 :(得分:1)

这不起作用的原因是它允许functionThatNeedsAnArrayOfBase()将不同的BaseModel子类添加到列表并破坏原始列表引用。

进一步解释的一个好例子是this堆栈溢出问题。

另一个很好的参考是Josh Bloch对Essential Java中的泛型的报道。