Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型和比较器_Java_Generics - Fatal编程技术网

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);