我有一个类,可以列出一个通用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){}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果有问题的参数是嵌套类型,则它不再编译:
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){}
}
Run Code Online (Sandbox Code Playgroud)
请注意,列表的功能无关紧要,第二个List类型可以是通用的,例如T类型的包装器.我真的不明白为什么会有任何不同.有没有解决的办法?
谢谢!
正如你显然已经意识到的那样,a List<Double>不是子类型List<Number>; 你需要使用通配符来使继承"传播"到泛型类型中:a List<Double>是一个子类型List<? extends Number>.但是,通配符必须从最外层一路:一个List<X>是子类型List<List<? extends Number>>仅X是正好一个List<? extends Number>.如果您想接受其他的子类型List<? extends Number>,例如List<Double>,您需要List<? extends List<? extends Number>>.