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

2022-09-01 02:57:55
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 数组,对吧???


答案 1

这将完成您要查找的内容:

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

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


答案 2

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