我正在处理generics
并发现以下代码在comparing method
处发出编译时错误。
此行有多个标记 - 无法推断用于比较的类型参数(功能) - 类型A没有定义适用于此处的m1(对象)
class A<T> {
String m1() {
return null;
}
}
class B {
void test() {
Comparator<A<String>> target = Comparator.comparing(A::m1).thenComparing(A::m1);
}
}
有人可以帮助我理解这种行为;我该如何解决这个问题?
答案 0 :(得分:7)
如果您在comparing
方法中指定了确切的泛型类型,则代码将进行编译。
Comparator<A<String>> target =
Comparator.<A<String>, String>comparing(A::m1).thenComparing(A::m1);
答案 1 :(得分:6)
您应该为A类指定类型参数。
Comparator<A<String>> target = Comparator.comparing(A<String>::m1).thenComparing(A<String>::m1);
答案 2 :(得分:2)
有趣的问题。没有进入JLS,但我想类型推断在链式方法调用的情况下不起作用。 (你可以看到它适用于简单的Comparator<A<String>> target = Comparator.comparing(A<String>::m1);
)
一个快速修复,类似于另一个答案,是帮助Java进行类型推断:
Comparator<A<String>> target = Comparator.comparing(A<String>::m1)
.thenComparing(A::m1);
请注意,在第一种方法中做这件事已经可以了。
(期待看看是否有人可以挖出JLS以确定这种推断是否应该是有效的:P)
答案 3 :(得分:1)
你可以嵌套为
Comparator<A<String>> target1 = Comparator.comparing(A::m1);
Comparator<A<String>> target2 = target1.thenComparing(A::m1);
myVarList.sort(target2);
答案 4 :(得分:0)
Comparator<A<String>> target = Comparator.comparing(A::m1).thenComparing(A::m1);
thenComparing()
期望Comparator
对象作为参数...