- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在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());
Error: java: incompatible types: V cannot be converted to capture#1 of ? extends V
让 V 与其子类的对象进行比较可能没有意义,但我很困惑为什么编译器在这种情况下会抛出错误?通配符有界泛型应该具有包容性,对吧?为什么编译器期望在compareTo方法的参数中包含V子类的对象?
最佳答案
真正需要的是 V
的每个实例与 V
的所有其他实例相比较(至少就类型系统所知;当然,compareTo
实现总是有可能在运行时强制执行额外的要求)。
V extends Comparable<? super V>
确保满足该要求:这意味着 V
的实例与 V
的某些父类(super class)型的所有实例相当,其中必然包括 V
的所有实例。 (请记住,类型的所有实例也是其所有父类(super class)型的实例。)
V extends Comparable<? extends V>
相比之下,不提供任何有用的保证;这意味着 V
的实例可以与 V
的某些子类型的实例进行比较,但该子类型可能根本不相关。
关于java - 为什么<? extends V> 不适用于 ComparisonByValue 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59852888/
在Java JDK中,我注意到Map类中有一个静态方法: public static > Comparator> comparingByValue() { return (c1, c2) ->
我是一名优秀的程序员,十分优秀!