Java编译错误:打开枚举

时间:2013-09-04 10:00:27

标签: java enums

我遇到了一个非常奇怪的错误,我无法弄清楚如何解决。

在Windows上编译得很好的项目在Linux上无法编译,但出现以下错误:

Cannot switch on a value of type AClass.Bbb. Only convertible int values, strings or enum variables are permitted
,即使陈述的类型枚举。

该类的代码是这样的:

public class AClass {
    private enum Bbb {
        ONE,
        TWO;
    }
    public void aMethod(List<Bbb> arg) {
        for (Bbb en : arg) {
            switch (en) {
                ....
            }
        }
    }
}

en中的switch(en)带有下划线,并带有上述错误通知。

还有其他人拥有它吗?有办法解决这个问题吗?

UPD Java版本:

java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

2 个答案:

答案 0 :(得分:2)

我已尝试过您的代码

public class AClass {
     enum Bbb {
        ONE,
        TWO;
    }
    public void aMethod(List<Bbb> arg) {
        for (Bbb en : arg) {
            switch (en) {

                case ONE: System.out.println("ONE");break;
                case TWO: System.out.println("TWO");break;
            }
        }
    }
    public static void main(String[] args) {

        List<Bbb> list = new ArrayList<Bbb>();
        list.add(Bbb.ONE);
        list.add(Bbb.TWO);

        new AClass().aMethod(list);
    }
}

它工作得很好。
我不知道像List<Bbb> arg那样传递论据的利弊,但至少它不是我在java 7中所知道的错误

答案 1 :(得分:2)

我不知道是否是与windows / linux相关的问题。但

从jdk5开始,你可以在switch case中使用enum,而在jdk7中你可以在switch case中使用String。在切换中使用enum时请确保:

  1. 您正在使用jdk5及更高版本
  2. 交换机中使用的所有标签必须是内部有效的enum对象 你的枚举用于开关。
  3. 在java中,enum是通过类概念实现的(java中的每个enum都扩展为Enumabstract类和Object类的直接子类)。所以在创建类似

    的枚举时
     public enum Bbb {
            ONE,
            TWO;
        }
    

    它将在内部意味着

    public static final Bbb ONE=new Bbb();
    public static final Bbb TWO=new Bbb();
    

    表示所有已定义的enum对象都是已定义enum类的公共,最终和静态对象。如果您使用其他内容作为switch label,则会产生编译时错误。

    对于java中的每个enumsuper class Enumfinal,所有enum类在内部实现为final。因此inheritance不能用于java中的enum。意味着我们不允许在switch labels中使用除我们自己的类enum对象之外的任何其他内容(甚至不是子类对象,因为enum类不能进一步inherited < / p>