Ответ 1
Это сделает то, что вы ищете:
public Sonnet29() {
poem = new String[] { "foo", "bar", "baz" };
}
Списки инициализации разрешены только при создании нового экземпляра массива.
public class Sonnet29 implements Poem {
private String[] poem;
public Sonnet29() {
poem = { "foo", "bar" , "baz"};
}
@Override
public void recite() {
//...
}
}
Линия poem = { "foo", "bar" , "baz"};
дает ошибку компиляции.
Любая конкретная причина, по которой это не разрешено? Как инициализировать массив String с помощью констант массива?
EDIT: Спасибо вам за ответы. Теперь я понимаю, что разрешено, а что нет. Но могу ли я спросить вас , почему это НЕ разрешено?
String[] pets;
pets = {"cat", "dog"};
После небольшой загрузки я нашел ссылку , в которой говорится, что такое кодирование оставляет компилятор в двусмысленности - Домашние животные должны быть массивом строк или массива объектов. Однако из объявления, он может очень хорошо понять, что это массив String, правильно???
Это сделает то, что вы ищете:
public Sonnet29() {
poem = new String[] { "foo", "bar", "baz" };
}
Списки инициализации разрешены только при создании нового экземпляра массива.
Инициализатор массива может быть указан в объявлении или как часть выражения создания массива (§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
{"cat", "dog"}
Не является массивом, это инициализатор массива.
new String[]{"cat", "dog"}
Это можно рассматривать как конструктор массива с двумя аргументами. Краткая форма - это просто, чтобы уменьшить RSI.
Они могли бы дать реальный смысл { "cat", "dog" }, чтобы вы могли сказать такие вещи, как
{"cat", "dog"}.length
Но почему они должны сделать компилятор еще сложнее писать, не добавляя ничего полезного? (Ответ ZoogieZork можно легко использовать)