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");

エンジンは、関連する場合は ScriptEngine です。Objecteclipse のコンパイラが を に直接キャストする行をコンパイルできるようにする方法を、一生理解できませんdouble

4

3 に答える 3

6

おそらく、あなたの友人は別のバージョンの Java 言語を使用しているでしょう。Objectto (プリミティブ型)のキャストはdouble、Java 7 では有効のようですが、Java 6 では無効です。友人に Eclipse でプロジェクト設定を変更してもらうか、コンパイラをバージョン 7 に更新してもらうことができます。

(クラス)Objectへのキャストは両方のバージョンで機能することに注意してください。Double

于 2013-02-03T21:04:19.617 に答える
5

許可されている変換が Java 5 と 7 の間で拡張されているようです。Java 言語仕様の第 3 版 (Java 5 および 6 用) :

参照型の値は、ボックス化解除変換 (§5.1.8) によってプリミティブ型にキャストできます。

ボックス化解除変換は、参照型の値をプリミティブ型の対応する値に変換します。具体的には、次の 8 つの変換をボックス化解除変換と呼びます。

  • ブール型からブール型へ
  • バイト型からバイト型へ
  • Character 型から char 型へ
  • ショートタイプからショートタイプへ
  • Integer 型から int 型へ
  • ロングタイプからロングタイプへ
  • フロート型からフロート型へ
  • Double型からDouble型へ

そのため、Java 5 および 6 では、Objectへのキャストdoubleは合法ではありません。

Java 言語仕様、Java SE 7 Edition には次のように書かれています。

次の表は、特定のキャスト変換で使用される変換を列挙しています。各変換は記号で示されます。

⇓ は参照変換の縮小を意味します (§5.1.6)

⊔ は、ボックス化解除の変換を意味します (§5.1.8)

次の表は、 Object から double へのキャストが

⇓,⊔</p>

つまり、 to からのキャストはObjectto へdoubleのキャストであり、Doubleその後に へのボックス化解除変換が続きdoubleます。

したがって、チームメイトが Java 7 用にコンパイルしているのに対し、あなたは Java 6 用にコンパイルしている可能性が非常に高くなります。

于 2013-02-03T21:26:40.803 に答える
2

許可されているキャスト変換については、JLS #5.5で詳しく説明されています。特に、次の変換が許可されています。

  • オプションで、ボックス化解除変換 (§5.1.8) または非チェック変換 (§5.1.9) のいずれかが続く縮小参照変換 (§5.1.6)

あなたの場合、cellValueが double の場合、 from のキャストObjectが許可され、 to をアンボックスするために to にキャストしようとObjectします。DoubleDoubledouble

于 2013-02-03T21:04:11.127 に答える