在构造函数中使用数组常量时出现编译器错误

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

Line poem = { "foo", "bar" , "baz"}; 给编译错误。

任何具体的原因为什么这是不允许的? 如何用数组常量初始化一个String数组?

编辑:谢谢你们的答案。 现在我清楚什么是允许的,什么不是。 但是,我可以问你为什么这是不允许的?

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

在googlesearch了一下之后,我发现这个链接 ,在这里,被告知这样的编码会使编译器不明确 – 宠物应该是string数组还是对象数组。 但是从声明中,可以很清楚的知道它是一个String数组,对吗?

这将做你正在寻找的东西:

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

只有在创build数组的新实例时才允许初始化列表。

从Java语言规范 :

数组初始值设定项可以在声明中指定,也可以作为数组创buildexpression式(第15.10节)的一部分,创build数组并提供一些初始值

总之,这是合法的代码:

 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"} 

这可以看作是一个有两个参数的数组“构造函数”。 简短的表格就是为了减lessRSI。

他们本可以赋予{“猫”,“狗”}真正的意义,所以你可以说这样的话

 {"cat", "dog"}.length 

但是为什么他们应该让编译器更难编写,而没有添加任何有用的东西呢? (ZoogieZork答案可以很容易地使用)