Java泛型通配符:为什么这不编译?

时间:2017-05-31 15:02:45

标签: java

class Demo {
    <T> void gTee(List<List<T>> tl) {
        tee(tl);
    }

    void tee(List<List<?>> tl) {
    }
}

JDK 8说

incompatible types: java.util.List<java.util.List<T>> cannot be converted to java.util.List<java.util.List<?>>

为什么?我认为?通配符代表任何类型

2 个答案:

答案 0 :(得分:4)

这是由于Java泛型的这种行为:

  

即使AB是兼容类型,SomeType<A>也与SomeType<B>不兼容

一个典型的例子就是尝试将List<Cat>分配给List<Animal>

同样的事情发生在这里。通常,List<T>可以分配给List<?>。但是,由于您要将List<List<T>>分配给List<List<?>>,所以不能。

答案 1 :(得分:4)

阿。圣洁立方体。我应该知道,但我没有想到:

enter image description here

https://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)#Use-site_variance_annotations_.28wildcards.29

现在编译:

class Demo {
    <T> void gTee(List<List<T>> tl) {
        tee(tl);
    }

    void tee(List<? extends List<?>> tl) {
    }
}