【问题标题】:Why can I compile this code via command line but not with Eclipse?为什么我可以通过命令行而不是 Eclipse 编译此代码?
【发布时间】:2016-01-15 16:18:57
【问题描述】:

这几行代码

    System.out.println(
        Stream.of("adam", "bob", "adrian", "brian")
        .collect(
                Collectors.groupingBy(
                        x -> x.substring(0,1),        //1
                        Collectors.joining("-")))
    );

通过命令行使用javac 时编译正常,但是当我尝试在 Eclipse 中编译时出现此错误

未定义 CharSequence 类型的方法 substring(int, int)

Eclipse 如何干扰编译器? IDE 不只是使用javac.exe 吗?

我正在使用带有 Oracle jdk1.8.0_45 的 Eclipse Luna 4.4.1

【问题讨论】:

  • 在 Eclipse Mars 4.5.1 中为我工作。只需升级。
  • 您的 Eclipse 项目是否可能使用不同版本的 Java 进行编译?
  • 您的问题的一般解决方案是:了解方程中的变量。在那种情况下:什么版本的 Java 在命令行上起作用(知道 Java 8 的东西)......以及你的 Eclipse 支持什么版本的 Java(可能不是 Java 8;所以猜你是在 Luna 上运行(? ) 或更老?!
  • 我可以确认这不能在带有 Java 8 的 Luna (4.4) 上编译,但可以在火星上运行。

标签: java eclipse java-8


【解决方案1】:

首先,您应该确保这不是语法错误。 将您的代码更改为如下所示:

x -> ((String) x).substring(0,1)

除了确保使用完全兼容 Java 8 的 Eclipse 版本外,还应检查是否允许 Eclipse 使用 Java 8 语言功能。

如果您没有指定正确的 JRE 版本,您可以按照此处所述进行更改:How to change JDK version for an Eclipse project

【讨论】:

  • 已经检查过,JRE 是正确的。在这一点上,这不应该被认为是一个错误吗?
  • 只要您确定这不适用于全新安装的 Eclipse 并且您的代码不包含任何错误。我必须将您的代码更改为 x -> ((String) x).substring(0,1) 才能使其在我的 STS 3.7.1 上运行
  • 就是这样!您无需任何更改即可使用 Oracle javac.exe 成功编译它
  • 也许你可以创建一个新的答案,并询问是否有可能在没有这个相当丑陋的演员阵容的情况下达到同样的效果。
  • 为了避免强制转换,您还可以像这样声明x 的类型:(String x) -> x.substring(0,1)。这将有助于编译器,同时也保持类型安全。不过,这看起来像是 eclipse
【解决方案2】:

自 4.5 Milestone 3 起,该问题已在 Eclipse 中得到解决,很可能是通过 bug 437444 解决的。该更改将一些错误修复与 Java 8 发布后的incorporating several JLS changes 结合在一起。

我们可以在规范更改之前讨论该示例是否实际上是合法的 Java 8(以前不允许推断使用来自嵌套 lambda 主体的某些信息),但我希望更新到 Eclipse 4.5.1 会让每个人都开心。

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2021-11-11
    • 1970-01-01
    • 2012-02-14
    • 2013-12-04
    相关资源
    最近更新 更多