2016-06-21 10 views
0

Я знаю, что это тривиальный вопрос, но это меня совершенно интригует;поведение значений перечисления в операторах switch, объявленных как внутренние классы

Как внутренние классы (не статический) члены не могут быть доступны непосредственно без экземпляра него даже в космическом классе,

и время, чтобы получить доступ статических констант и есть к области с наружным класса hai.x; , но в случае использования «enums switch as case constants» это похоже на другой путь; взгляд dostuff2()

случай RED: работает, но случай value.RED дает ошибку коммутатор случае метка перечисления должна быть безоговорочным именем перечисления постоянная

я знаю выше заявление говорит это все, мне просто любопытно

если мы предположим, что компилятор колодки это значение. 'Для всех стрелочных константы .. почему это не тот случай с нормальным declartion в перечислении, а значение V = RED

public class enumvalues 
{ 
    public enum values 
    { 
     RED,GREEN,VALUE  
    } 
    public class hai 
    { 
     static final int x=90;      
    } 
    public static class statichai 
    { 

    } 
    public static void main(String []args) 
{ 

} 

    public void dostuff2(values v) 
    { 
     // v =RED this is illegal 

     // System.out.println(RED); this will not compile because it cannot be accessed directly 
     // System.out.println(x); this will not compile because it cannot be accessed directly 



     switch(v) 
     { 
      case RED: //use of value.RED is strictly forbidden 
      System.out.println("red"); 
     } 
    } 
} 
+0

Вы попробовали 'value.RED' или' values.RED'? (уведомление 's' в' значениях 'в последнем) – Abubakkar

+0

значения enum обычно должны быть квалифицированы. Только для коммутационных шкафов была сделана короткая нотация. _That's all._ –

+0

Это просто правило языка программирования Java. Нет четкого ответа на вопрос «почему». Потому что дизайнеры языка Java думали, что это хорошая идея. Уже ясно, в каком типе перечисления вы включаете, поэтому наличие «values.RED» вместо «RED» в «case» было бы ненужной многословностью. – Jesper

ответ

1

Потому что потребуется создать специальный случай для перечислений для проверки. Рассмотрим другой пример

interface SomeInterface{} 
enum Values implements SomeInterface {RED}; 
enum MoreValues implements SomeInterface {RED}; 

public void dostuff2(SomeInterface value) 
{ 
value = RED; 
} 

Это очень похоже на ваш код на вашей, и dostuff2 точно такое же. Поскольку под капотом для списков компилятора являются только обычные классы. Итак, чтобы обработать ваш пример, вам нужно было добавить специальный регистр для обработки перечислений.

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

  • Нет связанных вопросов^_^