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

时间:2010-06-20 06:50:27

标签: java arrays compiler-errors

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数组,对吗?

3 个答案:

答案 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答案可以轻松使用)