如何将“MyClass”添加到“List<?扩展 MyClass>`

我有一个 Java 类,其中包含扩展 MyClass 的对象的子项。


class MyClass {

List<? extends MyClass> items;

[...]

出于某种原因,我无法将MyClass项目插入到此列表中。我不明白为什么,以及如何绕过这个问题。例如:


void foo(){

  items = new LinkedList<MyClass>(); // This is OK

  items.add(new MyClass()); // Not allowed... why?

}

编译器说“类型 List 中的方法 add(capture#1-of ? extends MyClass) 不适用于参数 (MyClass )”


我真的不明白如何绕过这个问题,以及为什么编译器应该只接受必须扩展MyClass的类型。


注意:为什么我需要使用这种方法?因为我需要允许 MyClass 的扩展具有子项列表。


白衣染霜花
浏览 171回答 3
3回答

茅侃侃

使用extends你只能从集合中获取。你不能投入进去。您可以使用super.所以,在你的情况下,如果你使用 -List<? super MyClass> items;你不会得到任何编译/运行时错误。虽然 super 允许 get 和 put,但获取期间的返回类型是? super T.

慕虎7371278

List<? extends MyClass> items表示类型参数是可分配给的未知类型MyClass。例如,它可能是一个List的MySubClass:public MySubClass extends MyClass{}List<? extends MyClass> items = new ArrayList<MySubClass>();现在考虑你有MyAnotherSubClass从MyClass太延伸:public MyAnotherSubClass extends MyClass{}MyClass item = new MyAnotherSubClass(); // refer it using MyClass显然,List<MySubClass> 不应允许包含MyAnotherSubClass:items.add(item); // compile error
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java