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

jai*_*jai 40 java arrays compiler-errors

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

poem = { "foo", "bar" , "baz"};正在给出编译错误.

有什么理由不允许这样做?如何使用数组常量初始化String数组?

编辑:谢谢大家的答案.现在我清楚什么是允许的,什么不是.但我可以问你为什么不允许这样做?

String[] pets;
pets = {"cat", "dog"};
Run Code Online (Sandbox Code Playgroud)

谷歌搜索后,我发现这个链接,其中,它被告知这样的编码使编译器不明确 - 宠物应该是字符串数组还是对象数组.但是从声明中,它可以很好地弄清楚它是一个String数组,对吗?

Zoo*_*ork 65

这将做你想要的:

public Sonnet29() {
    poem = new String[] { "foo", "bar", "baz" };
}
Run Code Online (Sandbox Code Playgroud)

只有在创建阵列的新实例时才允许初始化列表.


And*_*s_D 17

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"});
Run Code Online (Sandbox Code Playgroud)

这是非法的:

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
Run Code Online (Sandbox Code Playgroud)


Ish*_*tar 5

{"cat", "dog"}
Run Code Online (Sandbox Code Playgroud)

不是数组,它是一个数组初始化器.

new String[]{"cat", "dog"}
Run Code Online (Sandbox Code Playgroud)

这可以看作是一个带有两个参数的数组'构造函数'.简短形式就是降低RSI.

他们本可以赋予{"cat","dog"}真正的意义,所以你可以说出类似的东西

{"cat", "dog"}.length
Run Code Online (Sandbox Code Playgroud)

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