2013-09-04 3 views
3

Я столкнулся с очень странной ошибкой, которую я просто не могу понять, как ее решить.Ошибка компиляции Java: включите enum

проект, который компилируется нормально на 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) 
+1

Как насчет версий Java на этих машинах? – Juvanis

+1

Ошибка говорит значение типа 'Aaa.Bbb'. Это опечатка, или вы импортируете другой Bbb? – trogdor

+0

проверьте свой импорт, вы используете неправильный импорт для Bbb, Bbb не должен находиться в вашем списке импорта. – Felquir

ответ

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

+0

Я знаю, что он должен работать, и он работает на других машинах, но не на этом. – Ibolit

2

Я не знаю, связана ли это проблема с Windows/Linux. Но

С jdk5 вперед вы можете использовать enum в корпусе коммутатора, а из jdk7 вы можете использовать String в корпусе коммутатора. При использовании enum в коммутаторе убедитесь, что:

  1. вы используете jdk5 и позже
  2. Все метки, используемые в коммутаторе должен быть действительным enum объект внутри вашего перечисления используется в коммутаторе.

В Java перечисление осуществляется через класс концепции (Каждый п каждый enum в Java распространяется на 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, это даст ошибку времени компиляции.

Для каждого enum в Java, super classEnum является final и все enum классы внутренне реализованы как final. Таким образом, inheritance не может использоваться для enum в java.Значит мы не имеем права использовать что-нибудь еще в switch labels, кроме нашего собственного класса enum объектов (даже не подкласс объектов, потому что enum класс не может быть inherited дальше)

2

Проблема должна уйти, если ур использованием JDK1.7 .Try следующие ниже действия и см

  1. Открыть свойства проекта
  2. Нажмите на кнопку "Java Compiler"
  3. Checkmark "Включить конкретные параметры проекта"
  4. Set аль л выпадающего меню 1.7
  5. Hit ОК
  6. чистого проекта, чтобы вызвать восстанавливание

Если и сделать ниже, то проблема появляется снова.

  1. Откройте свойства проекта
  2. Нажмите на "Java Compiler"
  3. Clear "Включить проект конкретных параметров"
  4. Hit ОК
  5. Чистый проект для запуска восстанавливание (он будет восстановить автоматически)

Вот что я вижу, если я делаю следующее ...

  1. Откройте свойства проекта
  2. Нажмите на «Java Compiler»
  3. Нажмите на кнопку «Настройка параметров рабочего пространства»
  4. Я вижу, что «уровень Compiler соответствия» = 1,7
  5. Я вижу, что «Использовать по умолчанию настройки соответствия ".

Надеюсь, это поможет!

Смежные вопросы