public class Sonnet29 implements Poem {
private String[] poem;
public Sonnet29() {
poem = { "foo", "bar" , "baz"};
}
@Override
public void recite() {
//...
}
}
行poem = { "foo", "bar" , "baz"};
正在编译错误。
为什么不允许这样做的任何具体原因? 如何使用数组常量初始化String数组?
编辑:谢谢大家的回答。现在我清楚什么是允许的,什么不是。 但我可以问你为什么这是不允许的?String[] pets;
pets = {"cat", "dog"};
在谷歌搜索后,我发现了这个link,其中,它被告知这样的编码会使编译器模糊不清 - 宠物应该是字符串数组还是对象数组。但是从声明中,它可以很好地弄清楚它是一个String数组,对吗?
答案 0 :(得分:66)
这将满足您的需求:
public Sonnet29() {
poem = new String[] { "foo", "bar", "baz" };
}
只有在创建数组的新实例时才允许初始化列表。
答案 1 :(得分:17)
来自Java language specification:
数组初始值设定项可以在声明中指定,也可以作为数组创建表达式(第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
答案 2 :(得分:5)
{"cat", "dog"}
不是数组,它是一个数组初始值设定项。
new String[]{"cat", "dog"}
这可以看作是一个带有两个参数的数组'构造函数'。简短形式就是降低RSI。
他们本可以给{“cat”,“dog”}赋予真正的意义,所以你可以这样说
{"cat", "dog"}.length
但是为什么他们应该让编译器更难写,而不添加任何有用的东西? (ZoogieZork答案可以轻松使用)