直觉上(和错误地),我认为List<T>
的专业性不如List<? extends T>
,因此下面的内容不会编译(因为 return type covariance 要求在Derived中返回类型是与Base中的相同或子类型)-但可以编译!如果我们更改方法的位置,我(错误地)希望它能够编译。
但是,为什么这种方法起作用的严格(正确的)推理是什么?
class Base {
<T> List<? extends T> f1() {
return null;
}
}
class Derived extends Base {
<T> List<T> f1() { // fine !!! Not compile error.
return null;
}
}
除了我误会了什么-两种方法都具有<T>
-那么这两个T是否可能不同T
?
答案 0 :(得分:1)
为什么不编译? List<T>
是List<? extends T>
的子类型,即可以正常编译:
List<String> one = List.of("one");
List<? extends String> two = one;
也有人说,有界类型的通配符使类型协变。