3

我遇到了一个非常奇怪的错误,我不知道如何解决。

一个在 Windows 上编译得很好的项目,在 Linux 上不能编译,并出现以下错误:

无法打开 AClass.Bbb 类型的值。只允许可转换的 int 值、字符串或枚举变量
,即使声明的类型枚举。

该类的代码大致如下:

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

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

其他人有过吗?有没有办法解决这个问题?

UPD Java 版本:

java版本“1.7.0_25”
Java(TM) SE 运行时环境 (build 1.7.0_25-b15)
Java HotSpot(TM) 64 位服务器 VM(内部版本 23.25-b01,混合模式)
4

3 回答 3

3

如果您使用 JDK1.7,问题应该会消失。请尝试按照以下步骤操作并查看

  1. 打开项目属性
  2. 单击“Java 编译器”
  3. 勾选“启用项目特定设置”
  4. 将所有下拉菜单设置为 1.7
  5. 点击确定
  6. 清理项目以触发重建

如果你在下面做,那么问题会再次出现。

  1. 打开项目属性
  2. 单击“Java 编译器”
  3. 清除“启用项目特定设置”
  4. 点击确定
  5. 清理项目以触发重建(它将自动重建)

如果我执行以下操作,这就是我看到的...

  1. 打开项目属性
  2. 单击“Java 编译器”
  3. 单击“配置工作区设置”
  4. 我看到“编译器合规级别”= 1.7
  5. 我看到“使用默认合规性设置”被选中。

希望这可以帮助!!

于 2015-05-02T11:35:51.357 回答
2

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

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

  1. 您正在使用 jdk5 及更高版本
  2. 你的 switch 中使用的所有标签都必须是enum你的 enum 中用于 switch 的有效对象。

在java中,枚举是通过类概念实现的(java中的每个never都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类的公共、最终和静态对象。如果您使用其他东西 as switch label,它将给出编译时错误。

对于enumjava 中的 each,super class Enumisfinal和所有enum类都在内部实现为final. 所以inheritance不能enum在java中使用。switch labels意味着除了我们自己的类对象外,我们不允许使用其他任何东西enum(甚至不能使用子类对象,因为enum类不能inherited更进一步)

于 2013-09-04T11:08:39.523 回答
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 中所知道的那样错误

于 2013-09-04T10:06:27.843 回答