比较然后比较给出编译错误

2024-01-26

我正在尝试排序List使用 Java8 按姓名和年龄统计员工Comparator,我在下面创建了Comparator但它给了我一个编译器错误

Type mismatch: cannot convert from Comparator<Object> to <unknown>

    Comparator<String> c = Comparator.comparing(s -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //compile error

但如果我明确指定类型它就会起作用

    Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //works

或者通过创建两个Compartor和链条

    Comparator<String> name = Comparator.comparing(s -> s.split("\\s+")[0]);
    Comparator<String> age = Comparator.comparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
    Comparator<String> cc = name.thenComparing(age); //works

我已指定类型Comparator<String>在左侧,但为什么自动类型推断没有找到正确的类型并期望显式指定。

有人可以澄清一下吗?

这是代码

    String[] arr = { "alan 25", "mario 30", "alan 19", "mario 25" };
    Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
    List<String> sorted = Arrays.stream(arr).sorted(c).collect(Collectors.toList());
    System.out.println(sorted);

output

[alan 19, alan 25, mario 25, mario 30]

Java需要知道所有变量的类型。在许多 lambda 中,它可以推断类型,但在您的第一个代码片段中,它无法猜测类型s。我认为解决该问题的标准方法是明确声明它:

    Comparator<String> c = Comparator.comparing((String s) -> s.split("\\s+")[0])
            .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));

如果你看这个答案 https://stackoverflow.com/a/25501226/5772882,它在参数中具有类似的类型声明Comparator.comparing().

您的方法,显式给出类型参数comparing(),显然也有效。

对于你的另一种方法,声明两个比较器,我非常有信心在这种情况下 Java 可以从String在作业的左侧,就像传统的一样List <String> = new ArrayList<>();。当你继续打电话时thenComparing()在同一个表达式中,Java 无法再看到左侧的类型是相关的。这有点像int size = new ArrayList<>().size();这也有效:

    Comparator<String> name = Comparator.comparing(s -> s.split("\\s+")[0]);
    Comparator<String> c = name.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较然后比较给出编译错误 的相关文章

随机推荐