【问题标题】:Java compilation error: switch on enumJava编译错误:打开枚举
【发布时间】:2015-05-02 19:35:51
【问题描述】:

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

在 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) {
                ....
            }
        }
    }
}

switch(en) 中的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,混合模式)

【问题讨论】:

  • 这些机器上的Java版本怎么样?
  • 错误表示Aaa.Bbb 类型的值。是拼写错误,还是您导入了不同的 Bbb?
  • 检查你的导入,你为 Bbb 使用了错误的导入,Bbb 不应该在你的导入列表中。
  • @trogdor 打错了,我会改正的
  • @Juvanis 在帖子中添加了 java 版本信息。

标签: java enums


【解决方案1】:

如果您使用 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. 我看到“使用默认合规性设置”被选中。

希望这会有所帮助!

【讨论】:

    【解决方案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&lt;Bbb&gt; arg 这样传递参数的利弊,但至少它不像我在 java 7 中所知道的那样错误

    【讨论】:

    • 我知道它应该可以工作,它可以在其他机器上工作,但在这台机器上不行。
    【解决方案3】:

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

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

    1. 您使用的是 jdk5 及更高版本
    2. 在你的开关中使用的所有标签必须是一个有效的enum内部对象 你的枚举在 switch 中使用。

    在java中枚举是通过类概念实现的(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中的每个enumsuper classEnumfinal,所有enum类在内部实现为final。所以inheritance在java中不能用于enum。意味着我们不允许在 switch labels 中使用任何其他东西,除了我们自己的类 enum 对象(甚至不包括子类对象,因为 enum 类不能是 inherited 进一步)

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2015-03-13
      • 2020-05-26
      相关资源
      最近更新 更多