例如 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中不起作用?
您可以那样定义它,但是这样您就无法使用
List<Circle>
来搜索 Comparator<Shape>
,例如。
基本上,这里表达的方差允许更大的灵活性,同时保持类型安全。
稍微放大一下 Jon Skeet 的答案,Java 的泛型与 C++ 模板不同。 泛型的一些设计决策(例如类型擦除)是为了 JVM 本身的向后兼容性而做出的,但会导致语法尴尬和用例复杂。 您可以在这里阅读其中一些内容。