Java 泛型通配符:为什么这个代码无法编译?

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

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

JDK 8 表示

不兼容类型: java.util.List<java.util.List<T>> 无法转换为 java.util.List<java.util.List<?>>

为什么会这样? 我原以为 ? 通配符代表 任何类型

2个回答

4

4

这是由于Java泛型的行为导致的:

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

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

这里发生了相同的事情。通常,List<T>可以分配给List<?>。但由于您正在将List<List<T>>分配给List<List<?>>,因此无法这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接