Java 为什么<;?扩展V>;不适用于comparingByValue方法?

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

在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?扩展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());