我有一个简单的类结构:
class BaseModel {}
class Performer extends BaseModel {}
我有一个集合Performer
:
ArrayList<Performer> list = loadPerformerList();
为什么我不能这样做?
functionThatNeedsArrayOfBase( (ArrayList<BaseModel>)list );
或者,我该如何正确地做到这一点?
我有一个简单的类结构:
class BaseModel {}
class Performer extends BaseModel {}
我有一个集合Performer
:
ArrayList<Performer> list = loadPerformerList();
为什么我不能这样做?
functionThatNeedsArrayOfBase( (ArrayList<BaseModel>)list );
或者,我该如何正确地做到这一点?
子集合不是基集合。否则,您可以将基础对象添加到您的子集合中,从而打破假设(反之亦然)。
您可以将函数的参数指定为包含 base 的导数的列表:
void functionThatNeedsArrayOfBase(ArrayList<? extends BaseModel> list) {
//...
}
然后你可以直接通过list
而不施放
试试这个:<? extends BaseModel>
,它并没有说 BaseModel 的哪个子类,只是它是一个特定的。另请参阅<? super BaseModel>
根据您的需要。
列表是一个ArrayList
表演者。如果 java 允许您将其转换为ArrayList<BaseModel>
,那么即使当时的列表也仅包含 BaseModel(s),当将 Performer 添加到不是 BaseModel 的列表时会发生什么?如果我们允许,我们就会失去类型安全。
问题是 ArrayList 的类型安全。您可以在此StackOverflow Post上找到更详细的解释。简而言之,解决这个问题的方法是让方法接受 type 的类<? extends/super Performer>
。
这不起作用的原因是它允许functionThatNeedsAnArrayOfBase()
向列表添加不同的 BaseModel 子类并破坏原始列表引用。
进一步解释的一个很好的例子是这个堆栈溢出问题。
另一个很好的参考资料是 Josh Bloch 对 Essential Java 中的泛型的报道。