我有一个简单的类结构:
class BaseModel {}
class Performer extends BaseModel {}
我收集了Performer
s:
ArrayList<Performer> list = loadPerformerList();
为什么我不能这样做?
functionThatNeedsArrayOfBase( (ArrayList<BaseModel>)list );
或者,我该如何正确地做到这一点?
答案 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中的泛型的报道。