我有一个类,可以列出通用Number
和Double
来执行某个计算。
这很好用:
public class Test<T extends Number> {
public void testGeneric(List<T> list){
doTest(list);
}
public void testExplicit(List<Double> list){
doTest(list);
}
public void doTest(List<? extends Number> testList){}
}
但是,如果有问题的参数是嵌套类型,它就不再编译了:
public class Test<T extends Number> {
public void testGeneric(List<List<T>> list){
doTest(list);
}
public void testExplicit(List<List<Double>> list){
doTest(list);
}
public void doTest(List<List<? extends Number>> testList){}
}
请注意,列表的功能并不重要,第二个List类型可以是通用的,例如T类型的包装器。我真的不明白为什么会有任何不同。有办法解决这个问题吗?
谢谢!
答案 0 :(得分:5)
正如您显然已经意识到的那样,List<Double>
不是List<Number>
的子类型;你需要通配符来进行继承&#34;传播&#34;进入泛型类型:List<Double>
是List<? extends Number>
的子类型。但是,通配符必须从最外层开始:只有当List<X>
完全 a List<List<? extends Number>>
时,X
才是List<? extends Number>
的子类型}。如果您想接受List<? extends Number>
的其他子类型,例如List<Double>
,则需要List<? extends List<? extends Number>>
。