Java 可比VS<;?扩展可比性>;

Java 可比VS<;?扩展可比性>;,java,generics,java-8,extends,comparable,Java,Generics,Java 8,Extends,Comparable,关于以下代码: 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

关于以下代码:

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;
    }
}
公共类测试{
公共静态void main(字符串[]args){
List lst=Array.asList(“abc”、“def”);
系统输出println(func(lst));
}
公共静态布尔函数(列表lst){
返回lst.get(0).compareTo(lst.get(1))==0;
}
}
为什么写“?在这里扩展Comparable”会编译,而写“Comparable”不会编译

提前谢谢。

因为

List<String> lst = Array.asList("abc","def");
List lst=Array.asList(“abc”、“def”);
lst
列表具有泛型类型
String
,而不是
可比较的

String
类,hovewer,实现
可比较的
接口,所以它适合
?扩展可比较的
泛型类型。

这是因为不能将
列表
强制转换为列表。让我们假设它可以

List<String> sList = new ArrayList<>();
List<Comparable> cList = (List<Comparable>) sList;
cList.add(5);

这强制要求该类型与其自身具有可比性。您的函数比较列表中的第一个和第二个元素,因此最好确保列表中的每个元素实际上与其他每个元素都具有可比性。

之所以会出现这种情况,是因为泛型是不变的。即使
字符串
是一个
可比的
,也意味着:

String s = "";
Comparable c = s; // would work
这些泛型不起作用:

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

listC = listS; // will fail
据说:带有扩展边界的通配符使类型协变

这意味着:

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

listC = listS; // would work here
public static boolean func(List<? extends Comparable> lst) {
    ...
}
List<? extends Comparable> listC = List.of();
List<String> listS = List.of();

listC = listS; // would work here
 public static <T extends Comparable<? super T>> boolean func(List<T> lst) {
      .....
 }