【发布时间】:2019-05-07 12:59:04
【问题描述】:
我的班级中有以下成员:
List<? extends SomeObject> list;
当我尝试这样做时:
list.add(list.get(0));
我明白了:
Test.java:7: error: no suitable method found for add(CAP#1)
list.add(list.get(0));
^
method Collection.add(CAP#2) is not applicable
(argument mismatch; Object cannot be converted to CAP#2)
method List.add(CAP#2) is not applicable
(argument mismatch; Object cannot be converted to CAP#2)
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ? extends Object
CAP#2 extends Object from capture of ? extends Object
我的问题有两个:
为什么不能编译?为什么我不能将
get()的结果传递给add()?我怎样才能在不使用强制转换的情况下以另一种方式实现这一目标?
我知道在<T extends SomeObject> 的方法中我不能只说:
T someObject = list.get(0);
list.add(someObject);
因为我的 T 可能是 ? 扩展之外的另一个扩展。
我也明白我不能说:
List<? extends SomeObject> list1;
List<? extends SomeObject> list2;
list1.add(list2.get(0));
但是由于 add 和 get 应该在 list.add(list.get(0)) 中使用相同的泛型类型,我不明白为什么编译器不接受它。
我真正需要的是
[something of type T where T is whatever was used to instantiate list] someObject = list.get(0);
list.add(someObject);
这样我以后可以
list.add(someObject);
我认为我不应该为我的整个班级模板化来实现这一点,不是吗?
class MyClass<T extends SomeObject> {
List<T> list;
然后是一个方法
T someObject = list.get(0);
当然可以,但是我的代码的其他部分搞砸了。
所以第一个问题是为什么这不起作用,第二个问题是最好的解决方法是什么?
【问题讨论】: