我已经对这个问题绞尽脑汁了一段时间,我想也许会有一些新的人看到这个问题;谢谢你的时间。
import java.util.*;
class Tbin<T> extends ArrayList<T> {}
class TbinList<T> extends ArrayList<Tbin<T>> {}
class Base {}
class Derived extends Base {}
public class Test {
public static void main(String[] args) {
ArrayList<Tbin<? extends Base>> test = new ArrayList<>();
test.add(new Tbin<Derived>());
TbinList<? extends Base> test2 = new TbinList<>();
test2.add(new Tbin<Derived>());
}
}
在我看来,在test
中直接创建容器等同于在test2
中创建容器,但是编译器说:
Test.java:15: error: no suitable method found for add(Tbin<Derived>)
test2.add(new Tbin<Derived>());
^
如何编写Tbin
和TbinList
以使最后一行是可接受的?
请注意,我实际上将添加类型化的Tbin
s,这就是为什么我在最后一行中指定了Tbin<Derived>
。
发布于 2015-05-22 06:21:17
好的,答案是:
import java.util.*;
class Tbin<T> extends ArrayList<T> {}
class TbinList<T> extends ArrayList<Tbin<? extends T>> {}
class Base {}
class Derived extends Base {}
public class Test {
public static void main(String[] args) {
TbinList<Base> test3 = new TbinList<>();
test3.add(new Tbin<Derived>());
}
}
正如我所料,一旦我看到它,就会很明显。但要走到这一步要费很多周折。如果只看工作代码,Java泛型似乎很简单。
谢谢大家,感谢你们的参与。
发布于 2015-05-22 06:18:43
将TbinList
的定义替换为
class TbinList<T> extends ArrayList<Tbin<? extends T>> {}
并用来定义test2
TbinList<Base> test2 = new TbinList<>();
相反,它可以解决这个问题。
根据您的定义,您将得到一个ArrayList<Tbin<T>>
,其中T是扩展Base
的任何固定类。
发布于 2015-05-22 06:02:03
您正在使用有界通配符(TbinList<? extends Base>> ...
)。此通配符将阻止您向列表中添加任何元素。如果你想了解更多信息,这里有文档中关于Wildcards的章节。
https://stackoverflow.com/questions/30384955
复制相似问题