web-dev-qa-db-ja.com

コンストラクターで配列定数を使用しているときにコンパイラエラーが発生する

public class Sonnet29 implements Poem {
    private String[] poem;
    public Sonnet29() {
        poem = { "foo", "bar" , "baz"};
    }
    @Override
    public void recite() {
      //...
    }
}

poem = { "foo", "bar" , "baz"};はコンパイルエラーを出します。

これが許可されない具体的な理由はありますか?文字列配列を配列定数で初期化するにはどうすればよいですか?

編集:あなたの答えをありがとう人々。これで、何が許可され、何が許可されないかが明確になりました。しかし、私はあなたに尋ねることができますかなぜこれは許可されていませんか?

String[] pets;
pets = {"cat", "dog"};

少しグーグルした後、私はこれを見つけました link 、ここで、このようなコーディングはコンパイラをあいまいなままにすることが言われています-ペットが文字列の配列であるかオブジェクトの配列であるか。ただし、宣言から、それが文字列配列であることが非常によくわかります。

40
jai

これはあなたが探していることをします:

public Sonnet29() {
    poem = new String[] { "foo", "bar", "baz" };
}

初期化リストは、アレイの新しいインスタンスを作成する場合にのみ許可されます。

65
ZoogieZork

Java言語仕様 から:

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

要するに、これは法典です:

private int[] values1 = new int[]{1,2,3,4};
private int[] values2 = {1,2,3,4}; // short form is allowed only (!) here

private String[][] map1 = new String[][]{{"1","one"},{"2","two"}};
private String[][] map2 = {{"1","one"},{"2","two"}}; // short form

List<String> list = Arrays.asList(new String[]{"cat","dog","mouse"});

そしてこれは違法です:

private int[] values = new int[4];
values = {1,2,3,4}; // not an array initializer -> compile error

List<String> list = Arrays.asList({"cat","dog","mouse"}); // 'short' form not allowed
17
Andreas_D
{"cat", "dog"}

配列ではなく、配列初期化子です。

new String[]{"cat", "dog"}

これは、2つの引数を持つ配列「コンストラクター」と見なすことができます。短い形式はRSIを減らすためだけにあります。

{"cat"、 "dog"}に本当の意味を与えることができたので、次のように言うことができます。

{"cat", "dog"}.length

しかし、なぜそれらは、有用なものを追加せずに、コンパイラーをさらに書きにくくする必要があるのでしょうか? (ZoogieZorkの回答は簡単に使用できます)

5
Ishtar