在Java中使用嵌套泛型的通配符

时间:2015-02-14 23:47:35

标签: java generics

我有一个类,可以列出通用NumberDouble来执行某个计算。

这很好用:

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类型的包装器。我真的不明白为什么会有任何不同。有办法解决这个问题吗?

谢谢!

1 个答案:

答案 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>>