我正在尝试了解如何正确输入见证人。
这里有两个例子。
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
是否可以在上面的示例中输入见证以便编译?
查看错误消息(未发布)会告诉我们出了什么问题:
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>
,但如果您手动指定一个,则必须手动指定所有类型.