泛型类MyClass调用Comparator.reversed()逆序排序失败求助
解决泛型类逆序排序的类型推断问题
这是Java泛型里很常见的类型推断陷阱,我来帮你理清问题根源并给出可行的解决方案:
报错原因分析
你遇到的两个错误本质上都是泛型类型推断失败导致的:
- 当你链式调用
.reversed()时,Java编译器没办法从myClassList.sort(...)的上下文里正确推断出Comparator.comparing()方法的泛型参数(也就是MyClass<T>的类型参数T)。这导致它错误地把MyClass::getUpdatedTime这个实例方法引用当成了需要接收一个Object参数的方法,从而抛出参数不匹配的错误。 - 第二个“非静态方法不能从静态上下文引用”的错误是衍生问题:因为类型推断失败,编译器没认出这是实例方法引用,反而误以为你在尝试调用静态方法,所以报了这个错。
而当你去掉.reversed()时,编译器能直接从List<MyClass<T>>的类型推断出comparing()的目标类型是MyClass<T>,方法引用能被正确识别;改成非泛型类后,没有类型参数需要推断,方法引用的类型完全明确,自然也不会出错。
解决方案
这里有三种可靠的解决方式,任选其一即可:
1. 显式指定comparing方法的泛型参数
直接告诉编译器我们要处理的对象类型和键类型,避免推断混乱:
myClassList.sort(Comparator.<MyClass<T>, ZonedDateTime>comparing(MyClass::getUpdatedTime).reversed());
2. 先声明显式类型的比较器变量
通过变量的类型声明帮编译器锁定泛型类型,再调用逆序:
Comparator<MyClass<T>> baseComparator = Comparator.comparing(MyClass::getUpdatedTime); myClassList.sort(baseComparator.reversed());
3. 使用带显式参数类型的Lambda表达式
用Lambda代替方法引用,通过明确参数类型让编译器正确推断:
myClassList.sort(Comparator.comparing((MyClass<T> item) -> item.getUpdatedTime()).reversed());
内容的提问来源于stack exchange,提问作者HelpMatters
相关产品推荐
相关产品推荐

