Получение ошибки компилятора при использовании констант массива в конструкторе - PullRequest
40 голосов
/ 20 июня 2010
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"};

Немного погуглив, я нашел эту ссылку , где, как говорят, написанокак это оставляет компилятор в неоднозначности - будь то домашние животные должны быть массив строк или массив объектов.Однако, из объявления, он может очень хорошо понять, что это массив String, верно ???

Ответы [ 3 ]

65 голосов
/ 20 июня 2010

Это сделает то, что вы ищете:

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

Списки инициализации разрешены только при создании нового экземпляра массива.

17 голосов
/ 20 июня 2010

Из спецификации языка 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
5 голосов
/ 05 июля 2010
{"cat", "dog"}

Это не массив, это инициализатор массива.

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

Это можно рассматривать как массив 'конструктор' с двумя аргументами. Краткая форма только для того, чтобы уменьшить RSI.

Они могли бы дать реальное значение {"кот", "собака"}, так что вы могли бы сказать что-то вроде

{"cat", "dog"}.length

Но почему они должны усложнять написание компилятора, не добавляя ничего полезного? (Ответ ZoogieZork можно использовать легко)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...