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<?>>
为什么会这样? 我原以为 ?
通配符代表 任何类型。
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<?>>
为什么会这样? 我原以为 ?
通配符代表 任何类型。
现在已经编译成功了:
class Demo {
<T> void gTee(List<List<T>> tl) {
tee(tl);
}
void tee(List<? extends List<?>> tl) {
}
}
这是由于Java泛型的行为导致的:
即使
A
和B
是兼容的类型,SomeType<A>
也与SomeType<B>
不兼容。
一个经典的例子是尝试将List<Cat>
分配给List<Animal>
。
这里发生了相同的事情。通常,List<T>
可以分配给List<?>
。但由于您正在将List<List<T>>
分配给List<List<?>>
,因此无法这样做。