java - 可比 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”不会编译?
提前致谢。
解决方案
发生这种情况是因为泛型是不变的。即使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) {
.....
}
推荐阅读
- javascript - 在chartjs中的条形图上设置滚动
- linux - 应用程序装甲策略可防止颤振快照工作
- javascript - useReducer 和 useEffect 挂钩来获取数据
- php - 在 laravel trans 中获取本地的密钥
- .net - 有条件的安装不适用于管理安装 wix 工具集
- kubernetes - 在 kubernetes 上运行简单的 kafka 实例
- node.js - 将 primsa 模式导入 graphql 模式
- java - 无法将 docker 镜像推送到 heroku 注册表
- python - 有没有办法避免输入 QCoreApplication.translate("Context",?
- angular - 在 Opera mini 中用于 Angular 10 的填充物是什么?