Java 为什么<;?扩展V>;不适用于comparingByValue方法?
在Java JDK中,我注意到Map类中有一个静态方法:Java 为什么<;?扩展V>;不适用于comparingByValue方法?,java,generics,bounded-wildcard,Java,Generics,Bounded Wildcard,在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()); } 错误:java:不兼容的类型:V无法转换为捕获#1 of
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K, V>> comparingByValue() {
return (c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
错误:java:不兼容的类型:V无法转换为捕获#1 of?扩展V
将V与其子类的对象进行比较可能没有意义,但我不明白为什么编译器在这种情况下抛出错误?通配符有界泛型应该是包含的,对吗?为什么编译器希望compareTo方法的参数中有一个子类为V的对象?真正需要的是
V
的每个实例都可以与V
的每个其他实例进行比较(至少就类型系统而言;当然,compareTo
实现总是可能在运行时强制执行附加需求)
V extensed compariable真正需要的是V
的每个实例都可以与V
的每个其他实例进行比较(至少就类型系统而言;当然,comparieto
实现在运行时强制执行附加要求是可能的)
V extensed Comparable为了理解super
与extend
之间的关系,我使用了我自己发明的一种脑力疗法:放/写东西总是比读东西困难,super
意味着超人意味着他会写,所以使用来理解super
与之间的关系extend
我使用了我发明的以下大脑黑客:放/写东西总是比读东西困难,super
表示超人意味着他会写,所以使用
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());