Comparator.comparing 的显式类型参数会导致“泛型方法的类型参数数量不正确”编译错误

问题描述 投票:0回答:1

我正在尝试了解如何正确输入见证人。

这里有两个例子。

Comparator<String[]> comp1 = Comparator.comparing(arr->arr[0]);
comp1 = comp1.thenComparing(arr->arr[1]);

Comparator<String[]>comp2 = Comparator.<String[]>comparing(arr->arr[0])
        .thenComparing(arr->arr[1]);

第一个编译得很好。但第二个不能正确解决我正在比较字符串数组中的元素的问题。 为什么会这样?

如果我放弃类型见证并在第一个 lambda 声明中显式指定类型,则编译不会出现错误。

Comparator<String[]> comp3 = Comparator.comparing((String[] arr)->arr[0])
        .thenComparing(arr->arr[1]);

上面的错误是

Incorrect number of type arguments for generic method <T, U>comparing(Function<? super T,? extends U>) of type Comparator;
      it cannot be parameterized with arguments <String[]>
    - The type of the expression must be an array type but it resolved to T

是否可以在上面的示例中输入见证以便编译?

java comparator
1个回答
2
投票

查看错误消息(未发布)会告诉我们出了什么问题:

Comparator<String[]>comp2 = Comparator.<String[]>comparing(arr->arr[0])
                                       ^
    method Comparator.<T#1,U#1>comparing(Function<? super T#1,? extends U#1>) is not applicable
      (wrong number of type arguments; required 2)

具体来说,

method Comparator.<T#1,U#1>comparing
wrong number of type arguments; required 2
部分:您还需要指定 lambda 返回的类型(在本例中为
String
):

Comparator<String[]>comp2 = Comparator.<String[],String>comparing(arr->arr[0])
    .thenComparing(arr->arr[1]);

编译器足够聪明,如果您不指定任何类型(这就是第一个和第三个示例编译的原因),它会计算出类型是

<String[],String>
,但如果您手动指定一个,则必须手动指定所有类型.

© www.soinside.com 2019 - 2024. All rights reserved.