【问题标题】:How is it possible that a project compiles in eclipse, but javac throws compiler errors?一个项目怎么可能在eclipse中编译,但是javac抛出编译器错误?
【发布时间】:2013-01-18 14:10:25
【问题描述】:

正在为学校做一个小组项目,当我在命令行中运行 javac 时,以下行会引发错误。

Object result = engine.eval(equation); //evaluate the arithmetic expression
cellValue = (double) result; // <-- This throws a compiler error (obviously)

但由于某种原因,这在我的队友正在使用的 Eclipse 中编译和工作(!)。因为不敢相信,所以自己试了试确认。

ScriptEngine engine = manager.getEngineByName("JavaScript");

engine 是一个 ScriptEngine,如果这完全相关的话。我一生都无法弄清楚 eclipse 的编译器如何允许编译将 Object 直接转换为 double 的行。

【问题讨论】:

  • cellValue 是 double 还是 Double?如果是,那么该行应该编译。
  • 为什么你认为编译器错误是“明显的”?
  • 因为它试图将一个对象转换为一个原始...
  • 使用 java 1.6 我看到:Test.java:4: inconvertible types found : java.lang.Object required: double。看看你的朋友是否在 1.7 上。
  • FWIW:Java 7 的成功:ideone.com/eI6gQu

标签: java eclipse compiler-errors


【解决方案1】:

可能您的朋友正在使用其他版本的 Java 语言。 Objectdouble(原始类型)的转换在 Java 7 中似乎是合法的,但在 Java 6 中是不合法的。您可以让您的朋友在 Eclipse 中更改他们的项目设置或将您的编译器更新到版本 7。

请注意,将Object 转换为Double(类)在两个版本中都有效。

【讨论】:

  • 我的机器上安装了两个版本的 Java,卸载 Java JDK 6 后可以编译。
【解决方案2】:

似乎允许的转换已在 Java 5 和 7 之间扩展。在Java Language Specification, 3rd edition (for Java 5 and 6)

可以通过拆箱转换(第 5.1.8 节)将引用类型的值强制转换为原始类型。

拆箱转换将引用类型的值转换为原始类型的对应值。具体来说,以下8种转换称为拆箱转换:

  • 从布尔型到布尔型
  • 从字节类型到字节类型
  • 从字符型到字符型
  • 从短类型到短类型
  • 从 Integer 类型到 int 类型
  • 从 Long 类型到 long 类型
  • 从浮点型到浮点型
  • 从 Double 类型到 double 类型

所以在 Java 5 和 6 中,将 Object 转换为 double 是不合法的。

Java Language Specification, Java SE 7 Edition 写道:

下表列举了在某些类型转换中使用了哪些转换。每个转换都由一个符号表示:

⇓ 表示缩小引用转换(§5.1.6)

⊔ 表示拆箱转换(§5.1.8)

下表说明了从 Object 到 double 的转换

⇓,⊔

即从Objectdouble 的转换是到Double 的转换,然后是到double 的拆箱转换。

因此,您的团队成员很可能正在为 Java 7 进行编译,而您正在为 Java 6 进行编译。

【讨论】:

    【解决方案3】:

    JLS #5.5 中详细介绍了允许的强制转换。特别是,这种转换是允许的:

    • 缩小参考转换 (§5.1.6) 可选地后跟取消装箱转换 (§5.1.8) 或未经检查的转换 (§5.1.9)

    在您的情况下,如果cellValue 是双精度,则允许从Object 进行转换,并将尝试将Object 转换为Double,然后将Double 拆箱为double

    【讨论】:

    • Java 5 和 6 的 Java 语言规范中也存在同样的句子。我认为这意味着允许 double d = (Double) object,而不是 double d = (double) object
    • 我明白你的意思。我认为它允许 double d = (double) object; 基于下面的表 5.1,其中明确允许从 Object 到 double 的强制转换(显然也允许从 Object 到 Double )。
    • 啊,你是对的。我误读了旧规范,其中有一个句子的措辞与新规范几乎(但不完全)相同。投赞成票:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多