1

这不起作用:

    public enum TestEnum {

    FOO({"foobar","foobaz"}); //This fails

    private final String[] indicators;

    TestEnum(String[] indicators){
     this.indicators = indicators;
    }

    private String[] getIndicators(){
    return this.indicators;
    }

上面的代码编译失败。下面的编译成功

    public enum TestEnum {

FOO(new String[3]); //This is okay. Why?

private final String[] indicators;

TestEnum(String[] indicators){
    this.indicators = indicators;
}

private String[] getIndicators(){
    return this.indicators;
}

我的目标是提供一个可以由多个字符串表示的枚举。我知道EnumMap,但它不会在这里工作,因为我感兴趣的映射来自<String,enum>。我也知道我可以使用普通的Map. 我想我主要是好奇为什么 1 号不适合我。

4

4 回答 4

3

该表达式{"foobar","foobaz"}是一个数组初始值设定项,仅在直接声明数组时才有效。

尝试前置new String[]

FOO(new String[] {"foobar","foobaz"});

根据JLS,第 10.6 节

数组初始值设定项可以在声明中指定(第 8.3 节、第 9.3 节、第 14.4 节),或者作为数组创建表达式的一部分(第 15.10 节)来创建数组并提供一些初始值。

也就是说,您需要一个数组创建表达式,第 15.10 节

于 2013-05-02T20:27:42.697 回答
2

你可以这样做:

public enum TestEnum {
    FOO(new String[] { "foobar", "foobaz" });

    private final String[] indicators;

    TestEnum(String[] indicators) {
        this.indicators = indicators;
    }

    private String[] getIndicators() {
        return this.indicators;
    }
}
于 2013-05-02T20:27:35.203 回答
2

{"foobar","foobaz"}仅在初始化最近声明的数组时才有效,例如:

String[] foos = {"foobar","foobaz"};

如果您声明数组并尝试给出此值,它将无法编译:

String[] foos;
foos = {"foobar","foobaz"};

如果你想让它编译,你必须在new String[]之前添加{}

String[] foos;
foos = new String[]{"foobar","foobaz"};
于 2013-05-02T20:27:39.030 回答
1

代替

FOO({"foobar","foobaz"});

尝试

FOO(new String[]{"foobar","foobaz"});

这样编译器就知道你传递的数组的类型。

于 2013-05-02T20:27:24.547 回答