首页 > 解决方案 > 可比 VS

问题描述

关于以下代码:

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;
    }
}

为什么在这里写“? extends Comparable”会编译,而写“Comparable”不会编译?

提前致谢。

标签: javagenericsjava-8extendscomparable

解决方案


发生这种情况是因为泛型是不变的。即使String Comparable, 意思是:

String s = "";
Comparable c = s; // would work

这些泛型不起作用:

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

listC = listS; // will fail

无论 和 之间的关系如何,这都Comparable行不通String

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

public static boolean func(List<? extends Comparable> lst) {
    ...
}

这就是说:带有扩展绑定的通配符使类型协变。

这意味着 :

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

listC = listS; // would work here

或者用更简单的话来说,它意味着它List<String> 是 的子类型List<? extends Comparable>

现在要付出很小的代价,因为listC现在是元素的生产者,这意味着你可以从中取出元素,但你不能往里面放任何东西。

在你理解了这一点之后,你还没有完成,因为当这样写时,该方法的定义将是完全正确的:

 public static <T extends Comparable<? super T>> boolean func(List<T> lst) {
      .....
 }

推荐阅读