3

我有一个简单的类结构:

class BaseModel {}

class Performer extends BaseModel {}

我有一个集合Performer

ArrayList<Performer> list = loadPerformerList();

为什么我不能这样做?

functionThatNeedsArrayOfBase( (ArrayList<BaseModel>)list );

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

4

5 回答 5

10

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

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

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

然后你可以直接通过list而不施放

于 2012-06-06T19:35:47.667 回答
2

试试这个:<? extends BaseModel>,它并没有说 BaseModel 的哪个子类,只是它是一个特定的。另请参阅<? super BaseModel>根据您的需要。

于 2012-06-06T19:36:35.673 回答
1

列表是一个ArrayList表演者。如果 java 允许您将其转换为ArrayList<BaseModel>,那么即使当时的列表也仅包含 BaseModel(s),当将 Performer 添加到不是 BaseModel 的列表时会发生什么?如果我们允许,我们就会失去类型安全。

于 2012-06-06T19:34:56.310 回答
1

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

于 2012-06-06T19:38:32.283 回答
1

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

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

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

于 2012-06-06T19:44:19.670 回答