【发布时间】:2020-05-08 05:02:17
【问题描述】:
在Java JDK中,我注意到Map类中有一个静态方法:
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K, V>> comparingByValue() {
return (c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
出于好奇,我将代码更改为:
public static <K, V extends Comparable<? extends V>> Comparator<Map.Entry<K, V>> comparingByValue() {
return (c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
编译器在这一行给出错误:
return (c1, c2) -> c1.getValue().compareTo(c2.getValue());
错误:java:不兼容的类型:V 无法转换为 capture#1 of ?扩展V
将 V 与其子类的对象进行比较可能没有意义,但我很困惑为什么编译器会在这种情况下抛出错误?通配符有界泛型应该是包容性的吧?为什么编译器在 compareTo 方法的参数中期望 V 子类的对象?
【问题讨论】:
-
<? super V>和<? extends V>表示不同的东西——看看here -
为了了解
super与extend之间的理解,我使用了我创建的以下大脑技巧:put/write 事情总是比 read from,super表示 superman 表示他可以写,所以当你需要添加一些东西时使用<? super V>,左边是<? extend V>,它只是让你只读。 **这是我使用的脑图,何时使用extendvssuper**
标签: java generics bounded-wildcard