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"会不会编译?
提前致谢.
这是因为泛型是不变的.即使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)
而且这不会不管什么之间的关系是合作Comparable和String.
当您将该方法的定义更改为:
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)
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |