3

为学校做一个小组项目,当我在命令行中运行 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 的编译器是如何允许编译将 aObject直接转换为double.

4

3 回答 3

6

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

请注意,转换ObjectDouble(类)在两个版本中都有效。

于 2013-02-03T21:04:19.617 回答
5

似乎允许的转换已在 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 中,强制转换Objectdouble是不合法的。

Java 语言规范,Java SE 7 版写道:

The following tables enumerate which conversions are used in certain casting conversions. Each conversion is signified by a symbol:

⇓ signifies narrowing reference conversion (§5.1.6)

⊔ signifies unboxing conversion (§5.1.8)

and the following table says a cast from Object to double to be

⇓,⊔</p>

i.e. a cast from Object to double is a cast to Double followed by an unboxing conversion to double.

It is therefore very likely that your team mates are compiling for Java 7, while you are compiling for Java 6.

于 2013-02-03T21:26:40.803 回答
2

允许的转换在JLS #5.5中有详细说明。特别是,允许​​这种转换:

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

在您的情况下,如果cellValue是双精度,Object则允许进行转换,并将尝试转换Object到然后将toDouble拆箱。Doubledouble

于 2013-02-03T21:04:11.127 回答