2013-07-29 3 views
6

変数を定義している場合、次のように変数を定義/宣言するために完全に有効であると表示されます。Javaでは、{a、b、c、...}の配列は短命で、なぜ不適切なのですか?

double[][] output = {{0,0},{1,0}}; 

しかし、あなたは値を返している場合、次のように書くことが無効であると表示されます:

public double[] foo(){ 
     return {0,1,2} 
    } 

私は内部的には両方とも同じ動作をしていると考えていました。 Eclipseは、少なくとも、同意しない。誰が違いがあるのか​​、それ以外はどこで見られるのか、前者の例を受け入れて後者を拒否することが有益な理由は誰にも分かりますか?

編集:大丈夫ですが、初期化するときは適切ですが、あいまいさはありません...変数名から変数の型を解釈することはできませんでした(再定義する場合すでに初期化された変数)、またはリターン時(JVMは関数の戻り値の型を見ることができる)?暗黙の型を禁止するルールの特殊なケースは何ですか?一般規則に明示的な型が必要なのは何ですか?

答えて

5

それは、宣言時にのみ許容できるのです。ただし、new double[] {0, 1, 2}を使用することはできます。

JLS §10.6

配列初期化子は宣言で、又は 配列生成式の一部として指定することができます。

配列作成式はnew double[] { }の構文です。

+0

"宣言の際にのみ受け入れられます。"どうして?なぜreturn文中にないのですか? –

+0

@ JohnP言語で許可されていないためです。私が知る限り、それに対して良い事例はありません(私は、コンパイラが作成が安全であることを確実にするために、より多くの型推論をしなければならないかもしれないと思います)。 – Jeffrey

12

宣言のポイントでのみ中括弧表記を使用できます。ここで、コンパイラは宣言型から配列の型を推論できます。どこにもそれを使用するには

あなたはArray Creation Expressionを使用する必要があります。

return new double[] {0,1,2}; 
+0

「他の場所で使用するには、配列作成式を使用する必要があります。どうして? return文で同じ表記法を使用できないのはなぜですか? –

+0

@ JohnP。なぜなら、Java Language Creatorはそれをそのように設計したからです。 [JLSセクション10.6](http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6)を参照してください。 –

+0

いいえ、私はそうは思わない。なぜ鳥が毛皮の代わりに羽毛を発達させたのか尋ねると、「創造者がそのようにしたので」と言っても、満足できるものではないでしょうか?私はあなたが頼んだので純粋にジェフリーの答えを受け入れる可能性が高いです。 @ JohnP。 –

関連する問題