泛型和比较器

3
我正在处理泛型相关的问题,发现以下代码在“比较方法”处出现了编译时错误。

此行有多个标记: - 无法为comparing(Function)推断类型参数 - 类型A未定义m1(Object),不适用于此处

 class A<T> {
    String m1() {
        return null;
    }
}

class B {
    void test() {
        Comparator<A<String>> target = Comparator.comparing(A::m1).thenComparing(A::m1);
    }
}

有人可以帮我理解这种行为吗?我该如何解决这个问题?


@GhostCat-- 哈哈哈...明白了。是语言让我看不起自己。无论如何,与其质疑我的语言,请检查一下你的答案,它是不正确的。 - T-Bag
哪个答案呢?;-)……我希望你已经查看了我在那里提供的链接;因为那对你来说真的是一篇有趣的阅读。除此之外,请注意:在我确保你理解我为什么做出那个改变之前,我首先改进了你问题的措辞。 - GhostCat
5个回答

9
如果您在comparing方法中指定了确切的通用类型,代码就可以编译。
Comparator<A<String>> target =
    Comparator.<A<String>, String>comparing(A::m1).thenComparing(A::m1);

6
您需要为A类指定类型参数。
Comparator<A<String>> target = Comparator.comparing(A<String>::m1).thenComparing(A<String>::m1);

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)

1
你可以嵌套如下:

 Comparator<A<String>> target1 = Comparator.comparing(A::m1);
 Comparator<A<String>> target2 = target1.thenComparing(A::m1);


 myVarList.sort(target2);

0
Comparator<A<String>> target = Comparator.comparing(A::m1).thenComparing(A::m1);

thenComparing() 期望一个 Comparator 对象作为参数...


1
thenComparing有3个重载方法,其中两个接受一个Function - Andrew Tobilko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接