为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣染霜花 2021-08-13 16:37:39
我有一个 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 的扩展具有子项列表。
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

使用extends你只能从集合中获取。你不能投入进去。您可以使用super.

所以,在你的情况下,如果你使用 -List<? super MyClass> items;你不会得到任何编译/运行时错误。

虽然 super 允许 get 和 put,但获取期间的返回类型是? super T.


查看完整回答
反对 回复 2021-08-13
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-08-13
  • 3 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信