可比VS <?扩展Comparable>

Kin*_*nor 4 java generics extends comparable java-8

关于以下代码:

public class Test <T extends Comparable>{
    public static void main(String[] args){
        List<String> lst = Array.asList("abc","def");
        System.out.println(func(lst));
    }
    public static boolean func(List<**here**> lst){
        return lst.get(0).compareTo(lst.get(1)) == 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么在这里写"?extends Comparable" 会编译,写"Comparable"会不会编译?

提前致谢.

Eug*_*ene 8

这是因为泛型是不变的.即使String a Comparable,意思是:

String s = "";
Comparable c = s; // would work
Run Code Online (Sandbox Code Playgroud)

这些泛型不起作用:

List<Comparable> listC = List.of();
List<String> listS = List.of();

listC = listS; // will fail
Run Code Online (Sandbox Code Playgroud)

而且这不会不管什么之间的关系是合作ComparableString.

当您将该方法的定义更改为:

public static boolean func(List<? extends Comparable> lst) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这就是说:带有扩展边界的通配符使得类型协变.

这意味着 :

List<? extends Comparable> listC = List.of();
List<String> listS = List.of();

listC = listS; // would work here
Run Code Online (Sandbox Code Playgroud)

或者在简单的话就意味着List<String> 是一个亚型List<? extends Comparable>.

现在有一个小的代价,因为listC现在是元素的生产者,这意味着你可以从中获取元素,但你不能把任何东西放进去.

在你理解了这一点之后,你还没有完成,因为这个方法的定义完全正确,如下所示:

 public static <T extends Comparable<? super T>> boolean func(List<T> lst) {
      .....
 }
Run Code Online (Sandbox Code Playgroud)