当前位置: 首页 > 知识库问答 >
问题:

日食或爪哇错误;λ 类型推断

吴星汉
2023-03-14

以下代码可以用javac和Eclipse 4.6.1/4.6编译,但在Eclipse 4.6.2中会产生一个错误:

package ecbug;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Foo
{
    class A
    {
        public int getStart() { return 0; }
    }

    void someMethod(List<A> toRemove)
    {
        Collections.sort(toRemove, Comparator.comparing(t -> -t.getStart()));
    }
}

Eclipse 4.6.2 在 -t.getStart() 下抱怨存在类型不匹配:无法从 int 转换为可比较

我认为Comparator.comparing(…)的参数应该是Comparable

我强烈怀疑这是一个Eclipse bug,但是肯定有Eclipse正确实现了语言规范而javac没有的情况,所以似乎值得问一下:这是一个Eclipse bug还是一个javac bug?有语言律师能指出语言规范的相关部分吗?

可能相关的问题,在我看来不是重复的:

Java 8 流 flatMap 和分组按代码编译器错误 - 类似的错误消息,但不清楚它是否是完全相同的问题;回答声称它是一个日食错误,但没有提供错误链接或JLS引用;指的是旧的日食版本。

为什么这个使用类型推理的java 8例子没有在Eclipse中编译?-与之前相似

flatMap返回列表后的Java流收集


共有1个答案

令狐弘益
2023-03-14

你的解释不切合实际。Comparator.comparing(…)(单参数版本)的参数不应为Comparable

所以当你说

Eclipse似乎认为lambda函数应该返回Comparable

你对日食的期望是正确的,Eclipse的期望也是正确的。

但是您的函数返回一个应该进行比较的int值,当您将该值装箱到intger时,您有一个满足预期U扩展可比的类型

顺便提一下,当您想要比较< code>int属性时,您可能想要使用< code>Comparator.comparingInt(...)反正。有了这个工厂,返回的比较器完全避免了将< code>int装箱为< code>Integer。

此外,不应通过求反来反转整数顺序。问题是
-整数。MIN_VALUE==整数。MIN_VALUE,因为尝试对可能的最小intVALUE求反会导致溢出,溢出值的计算结果将再次为最小的int值,而不是最大的值。在很多情况下,使用否定来颠倒订单可能会奏效,在其中一些情况下,这可能是合理的,因为这种特殊值可以被排除,但是,它会产生一种坏习惯,在这种情况可能发生的情况下,这种情况会适得其反,当然,这种情况很少发生,通常只发生在客户身上…

正确的成语应该是

Collections.sort(toRemove, Comparator.comparingInt(A::getStart).reversed());

它通过交换两个元素来进行比较,这在所有场景中都有效,并且没有性能缺陷。

 类似资料:
  • 我正在尝试将一个项目切换到Java8,并在日食月神和javac的类型推断之间遇到了奇怪的差异。使用JDK 1.7.0_65 javac,这段代码编译得很好。JDK 1.8.0_11 抱怨 toString(字符[]) 和 toString(可抛出)都匹配“toString(getKey(代码,空)]”行。日食 Luna 4.4 (I20140606-1215) 使用任一 JDK 愉快地编译它: 我

  • 我试图在macOS高Sierra上的eclipse氧气4.7.3a上使用windows Builder。它安装良好,但每次我尝试打开设计部分时,它都会显示此错误 Eclipse在0下运行,但是这个Java项目有1.8Java的合规级别,因此WindowBuilder将无法从该项目加载类。对项目使用较低级别的Java,或者使用较新的Java版本运行Eclipse。 我什么都试过了。就像改变运行环境,

  • 我在mac os X 10.6.8上安装了詹金斯,成功安装詹金斯后,我在浏览器中以默认地址浏览它http://localhost:8080但tomcat页面显示的不是詹金斯主页。我读了jenkins的文档,它将需要执行命令java-jarjenkins.war--http pPort=8080 当执行命令java-jarjenkins时。war——httpPort=8080 有这个错误 2016-

  • 我已经在网站上看到了“解决方案”http://www.rgagnon.com/javadetails/java-0506.html,但它不能正常工作。昨天(六月八日)应该是159,但它说是245。 那么,有没有人用Java解决方案来获取当前日期的三位数朱利安日(不是朱利安日——我需要今年的日期)? 谢谢!马克

  • 作为一个学习项目,我正在编写一个通过TCP的聊天服务器。我今天一直在修补ws crate,但我遇到了一个问题。这是我编写的代码,修改了他们的服务器示例。 当我尝试编译它时,我得到一个错误: 为什么会这样?我怎样才能解决这个问题?

  • 问题内容: 我有这个Java代码段。我是Java的菜鸟。 错误: 码: 问题答案: 是的,这是问题所在: 在课程的最高级别,您只能拥有: 实例初始化程序块() 静态初始值设定块() 变量声明 构造函数声明 方法声明 嵌套类型声明 终结器声明 这些都不是。如果你 的意思 来声明一个变量,你应该这样做: 如果这 不是 您想要的,则应解释您的意图。 编辑:修复此问题后,此编译器错误似乎很明显: Conf