为什么java集合中的泛型这么奇怪?

问题描述 投票:0回答:2

例如 java.util.Collections 中的检查方法

 public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 

为什么我可以这样定义:

 public static <T> int binarySearch(List<T> list, T key, Comparator<T> c) 

为什么这在java中不起作用?

java generics
2个回答
14
投票

可以那样定义它,但是这样您就无法使用

List<Circle>
来搜索
Comparator<Shape>
,例如。

基本上,这里表达的方差允许更大的灵活性,同时保持类型安全。


0
投票

稍微放大一下 Jon Skeet 的答案,Java 的泛型与 C++ 模板不同。 泛型的一些设计决策(例如类型擦除)是为了 JVM 本身的向后兼容性而做出的,但会导致语法尴尬和用例复杂。 您可以在这里阅读其中一些内容。

© www.soinside.com 2019 - 2024. All rights reserved.