泛型和比较器

时间:2017-06-19 08:30:58

标签: java generics

我正在处理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);
    }
}

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

5 个答案:

答案 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对象作为参数...