Java子类适用的常量比较器或方法的正确签名是什么
首先补充一个前置前提:你给出的Some抽象类需要补充rank字段的getter方法才能让后续的比较器实现编译通过,示例如下:
abstract class Some { int rank; public int getRank() { return rank; } }
问题1:comparingRank()方法是否需要使用<? super T>泛型通配符?
建议添加,理由如下:
- 遵循Java泛型PECS原则:Comparator作为消费传入对象做比较的工具,属于消费者场景,适用
super通配符 - 提升API灵活性:添加通配符后返回值类型为
Comparator<? super T>,可以兼容更多泛型赋值场景,比如你需要将该比较器和其他针对父类Some的比较器做链式拼接,或者赋值给声明为Comparator<? super Some子类>的变量时,不会出现泛型类型不匹配的编译问题 - 你当前的实现逻辑本质是返回一个可比较所有
Some实例的比较器,用<? super T>的声明也更符合实际返回值的类型语义,避免不必要的泛型类型强转
修改后的方法示例:
static <T extends Some> Comparator<? super T> comparingRank() { return Comparator.comparingInt(Some::getRank); }
问题2:COMPARING_RANK字段是否需要使用<? super T>泛型通配符?
不需要,也不允许使用,理由如下:
- 这里的
T是泛型方法上声明的类型参数,属于方法级别的泛型约束,而COMPARING_RANK是类级别的静态常量,无法引用方法级别的类型参数,强行添加会直接编译报错 - 你当前定义的
Comparator<Some>已经足够使用,它可以比较所有Some及其子类的实例,如果你想进一步提升灵活性,最多可以把类型声明为Comparator<? super Some>,完全不需要引入额外的泛型参数T
内容的提问来源于stack exchange,提问作者Jin Kwon
相关产品推荐
相关产品推荐

