我遇到了一个非常奇怪的错误,我无法弄清楚如何解决。
在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)
答案 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
时请确保:
enum
对象
你的枚举用于开关。在java中,enum是通过类概念实现的(java中的每个enum
都扩展为Enum
类abstract
类和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中的每个enum
,super class
Enum
为final
,所有enum
类在内部实现为final
。因此inheritance
不能用于java中的enum
。意味着我们不允许在switch labels
中使用除我们自己的类enum
对象之外的任何其他内容(甚至不是子类对象,因为enum
类不能进一步inherited
< / p>