Java 在构造函数中使用数组常量时获取编译器错误

Java 在构造函数中使用数组常量时获取编译器错误,java,arrays,compiler-errors,Java,Arrays,Compiler Errors,行poem={“foo”,“bar”,“baz”}给出编译错误 不允许这样做的具体原因是什么? 如何使用数组常量初始化字符串数组 编辑:谢谢大家的回答。现在我很清楚什么是允许的,什么是不允许的。 但是我可以问你为什么这是不允许的吗 public class Sonnet29 implements Poem { private String[] poem; public Sonnet29() { poem = { "foo", "bar" , "baz"};

poem={“foo”,“bar”,“baz”}给出编译错误

不允许这样做的具体原因是什么? 如何使用数组常量初始化字符串数组

编辑:谢谢大家的回答。现在我很清楚什么是允许的,什么是不允许的。 但是我可以问你为什么这是不允许的吗

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

在谷歌搜索了一段时间后,我发现了这一点,在这里,有人告诉我,这样的编码会让编译器产生歧义——pets应该是字符串数组还是对象数组。然而,从声明中,它可以很好地看出它是一个字符串数组,对吗

这将满足您的需求:

String[] pets;
pets = {"cat", "dog"};
只有在创建阵列的新实例时才允许使用初始化列表。

从:

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

简言之,这是法律法规:

public Sonnet29() {
    poem = new String[] { "foo", "bar", "baz" };
}
private int[]values1=新的int[]{1,2,3,4};
私有int[]值2={1,2,3,4};//这里只允许使用缩写形式(!)
私有字符串[][]map1=新字符串[][{{“1”,“1”},{“2”,“2”};
私有字符串[][]map2={{“1”,“1”},{“2”,“2”};//缩略形式
List List=Arrays.asList(新字符串[]{“猫”、“狗”、“鼠标”});
这是非法的:

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[]值=新的int[4];
值={1,2,3,4};//不是数组初始值设定项->编译错误
List List=Arrays.asList({“猫”、“狗”、“鼠标”});//不允许使用缩写形式
不是数组,它是数组初始值设定项

{"cat", "dog"}
这可以看作是一个带有两个参数的数组“构造函数”。简短的形式只是为了减少RSI

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

new String[]{"cat", "dog"}

但是为什么他们要在不添加任何有用内容的情况下使编译器更难编写呢?(ZoogieZork答案可以很容易地使用)

如果这些是常量,那么不应该在构造函数中初始化
poem
。@True Soft:我只是想用一些常量“初始化”对象状态。同意。如果poem声明为STATIC,则私有静态字符串[]poem={“foo”、“bar”、“baz”};它工作得很好。@HanuAthena,不管成员是否是
静态的
,这里的问题是数组初始值设定项只能在声明(§8.3,§9.3,§14.4)中使用,或者作为数组创建表达式的一部分(§15.10)。因此,如果没有
static
它也将工作
private String[]poem={“foo”、“bar”、“baz”}如果在现场执行此操作,则可能会重复
new String[]{"cat", "dog"}
{"cat", "dog"}.length