Java 泛型和比较器
我正在研究Java 泛型和比较器,java,generics,Java,Generics,我正在研究泛型,发现下面的代码在比较方法中给出了编译时错误 这条线上有多个标记 -无法推断用于比较(函数)的类型参数 -类型A未定义适用于此处的m1(对象) A类{ 字符串m1(){ 返回null; } } B类{ 无效测试(){ 比较器目标=比较器。比较(A::m1)。然后比较(A::m1); } } 有人能帮我理解这种行为吗;我怎样才能解决这个问题 比较器目标=比较器。比较(A::m1)。然后比较(A::m1); 然后比较()需要一个比较器对象作为参数…如果在比较方法中指定确切的泛型类型
泛型
,发现下面的代码在比较方法
中给出了编译时错误
这条线上有多个标记
-无法推断用于比较(函数)的类型参数
-类型A未定义适用于此处的m1(对象)
A类{
字符串m1(){
返回null;
}
}
B类{
无效测试(){
比较器目标=比较器。比较(A::m1)。然后比较(A::m1);
}
}
有人能帮我理解这种行为吗;我怎样才能解决这个问题
比较器目标=比较器。比较(A::m1)。然后比较(A::m1);
然后比较()
需要一个比较器
对象作为参数…如果在比较
方法中指定确切的泛型类型,代码将编译
Comparator<A<String>> target =
Comparator.<A<String>, String>comparing(A::m1).thenComparing(A::m1);
比较器目标=
比较器。比较(A::m1)。然后比较(A::m1);
您可以嵌套为
Comparator<A<String>> target1 = Comparator.comparing(A::m1);
Comparator<A<String>> target2 = target1.thenComparing(A::m1);
myVarList.sort(target2);
Comparator target1=比较器比较(A::m1);
比较器target2=target1。然后比较(A::m1);
myVarList.sort(target2);
您应该为A类指定类型参数
Comparator<A<String>> target = Comparator.comparing(A<String>::m1).thenComparing(A<String>::m1);
比较器目标=比较器。比较(A::m1)。然后比较(A::m1);
有趣的问题。我还没有进入JLS,但我想类型推断在链式方法调用的情况下不起作用。(您可以看到它适用于一个简单的
比较器target=Comparator.comparating(a::m1);
)
一个类似于另一个答案的快速修复方法是帮助Java进行类型推断:
Comparator<A<String>> target = Comparator.comparing(A<String>::m1)
.thenComparing(A::m1);
比较器目标=比较器比较(A::m1)
.然后比较(A::m1);
请注意,在第一个方法中这样做已经达到了目的
(期待有人能找出JLS,看看这样的推断是否有效:p)Then Comparing有3个重载方法,其中两个使用了
函数
@GhostCat——哈哈哈……明白了。正是这种语言让我不屑一顾。无论如何,请检查你的答案,而不是质疑我的语言,它是不正确的。哪个答案;-)。。。我希望你已经检查了我在那里的链接;因为这对你来说真的是一本有趣的书。除此之外:请注意,我首先改进了你问题中的措辞,然后才继续确保你理解我为什么做出这样的更改。
Comparator<A<String>> target = Comparator.comparing(A<String>::m1).thenComparing(A<String>::m1);
Comparator<A<String>> target = Comparator.comparing(A<String>::m1)
.thenComparing(A::m1);