2014-12-18 2 views
1

У меня есть два Java фрагменты, используя константу в случае переключения:Разница между постоянными деклараций

final Integer s1=5; 
int x=5; 
switch(x){ 
    case s1: **<== causes complilation error..** 
     System.out.println("hello"); 
} 

Приведенный ниже код работает нормально, как s1 трактуется как константа, в то время как выше код не работает.

final int s1=5; 
int x=5; 
switch(x){ 
    case s1: <=== ok s1 is constant 
     System.out.println("hello"); 
} 

В чем разница между двумя вышеуказанными декларациями?

+0

Очень близко, но не совсем дубликат: http://stackoverflow.com/questions/4401743/why-final-static-int-can-be-used-as-a-switchs-case-constant-but- not-final-st (здесь также применяется ответ) – Thilo

+0

Я не понимаю, в чем вопрос. Хорошо, вы видели, что одна из этих работ, а другая - нет. Вы знаете, какая разница между ними. Что именно вы спрашиваете? –

+1

http://www.coderanch.com/t/329474/java/java/final-static-Integer-considered-constant – Thilo

ответ

3

Язык Java Спецификация defines:

SwitchLabel:

  • случай ConstantExpression:
  • случай EnumConstantName:
  • по умолчанию:

То есть метка case должна быть либо именем константы перечисления, либо константным выражением. Спецификации также says:

Константа выражение является выражение, обозначающее значение примитивного типа или строка, которая не завершается внезапно и состоит, используя только следующее:

То есть, Integer не является константным выражением типа компиляции и поэтому не может использоваться как метка case.

2

switch заявления работают только на примитивных типах и String s и enum s. Integer не является ни примитивным, ни String, либо enum, поэтому он дает ошибку компиляции.

+0

Хм ... но вы можете «переключиться» на Integer, не так ли (просто не «случай»)? – Thilo

+4

Не забывайте 'enum's –

+0

Я думаю, что это больше похоже на то, что говорит ошибка: с Integer это не считается« постоянным выражением ». Ничего общего с «переключателем». – Thilo

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