覆盖方法和`List <t>'和'List <!-?扩展T->'

时间:2019-05-18 15:35:38

标签: java generics bounded-wildcard

直觉上(和错误地),我认为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

1 个答案:

答案 0 :(得分:1)

为什么不编译? List<T> List<? extends T>的子类型,即可以正常编译:

List<String> one = List.of("one");
List<? extends String> two = one;

也有人说,有界类型的通配符使类型协变。