1

宣言ステートメント以外のステートメントで中かっこを使用して配列を初期化しようとすると、コンパイル エラーが発生するのはなぜですか?

class Demo {
    public static void main(String[] args) {
        String[] myName;
            myName = {"AA", "BB", "CC"};
        for(String s: myName) {
            System.out.print(s + " ");
        }
    }
}

宣言ステートメントでのみ中括弧を使用して初期化する必要があるのは何ですか?

demo.java:4: error: illegal start of expression
                myName = {"AA", "BB", "CC"};
                         ^
demo.java:4: error: not a statement
                myName = {"AA", "BB", "CC"};
                          ^
demo.java:4: error: ';' expected
                myName = {"AA", "BB", "CC"};
                              ^
demo.java:5: error: illegal start of type
                for(String s: myName) {
                ^
demo.java:5: error: ')' expected
                for(String s: myName) {
                            ^
demo.java:5: error: <identifier> expected
                for(String s: myName) {
                                    ^
demo.java:10: error: class, interface, or enum expected
}
^
7 errors
4

2 に答える 2

7

宣言ステートメント以外のステートメントで中括弧を使用して配列を初期化しようとすると、コンパイルエラーが発生するのはなぜですか?

基本的に、Javaでそれを行うのは有効ではないからです。コンパイラは、Java言語仕様のルールを適用しているだけです。配列タイプを指定する必要があります。

myName = new String[] { ... };

Java言語仕様のセクション10.6から:

配列初期化子は、宣言(§8.3、§9.3、§14.4)で指定するか、配列作成式(§15.10)の一部として指定して、配列を作成し、いくつかの初期値を提供することができます。

宣言に関するさまざまなセクションには、このプロダクションが含まれます。

VariableInitializer:
    Expression
    ArrayInitializer

一方、配列作成式(セクション15.10)は次のとおりです。

ArrayCreationExpression:
    new PrimitiveType DimExprs Dimsopt
    new ClassOrInterfaceType DimExprs Dimsopt
    new PrimitiveType Dims ArrayInitializer 
    new ClassOrInterfaceType Dims ArrayInitializer

DimExprs:
    DimExpr
    DimExprs DimExpr

DimExpr:
    [ Expression ]

Dims:
    [ ]
    Dims [ ]

後で:

宣言ステートメントでのみ中括弧を使用して初期化する必要があるのは何の意味ですか?

他の面では言語仕様が単純化されているのではないかと思います。私はあなたがこれを行うことができるはずであるように見えることに同意します-宣言時のように、コンパイラが変数型から配列型を推測できることを期待するかもしれません。ただし、一般に、ほとんどの言語では、代入演算子の右側にある式のタイプは、代入のターゲットの影響を受けないことに注意してください。通常のステートメント内の各式のタイプについて、同じステートメント内の他の式を参照せずに明確に定義することは、一般的に言語用語ではより適切です。

配列作成式を使用してコードを修正するのはかなり簡単な修正なので、私はそれを使用します。

于 2012-12-01T10:50:09.577 に答える
5

The syntactically correct way to write what you're trying to write is:

myName = new String[]{"AA", "BB", "CC"};

I suspect the reason Java doesn't allow omitting new String[] is that in many contexts there's no way for the compiler to figure out the desired type of the array from the types of the elements. Let's say you were allowed to write:

{1, 2, 3}

Is that int[], Integer[], Number[] or Object[]?

The only place where are you're allowed to omit new String[] is initializers, where the compiler already knows the array type.

于 2012-12-01T10:40:58.827 に答える