Выражение переключателя не может быть плавающим, двойным или логическим - PullRequest
28 голосов
/ 28 февраля 2011

Почему выражение switch не допускает значения long, float, double или boolean в Java?почему допускаются только int (и те, которые автоматически повышаются до int)?

Ответы [ 4 ]

29 голосов
/ 28 февраля 2011

Float и double было бы неудобно использовать надежно, даже если бы они были возможны - не забывайте, что выполнение точных совпадений равенства на float / double в любом случае обычно является плохой идеей из-за характера представления.

Для логических значений, почему бы просто не использовать if для начала?

Я не могу вспомнить когда-либо желающих включить любой из этих типов, если честно.Вы имеете в виду конкретный вариант использования?

4 голосов
/ 28 февраля 2011

Вы можете использовать enum в операторе switch, и Java 7 добавит строку AFAIK.Оператор switch происходит из C, где разрешены только int, а реализация других типов более сложна.

Числа с плавающей запятой не являются хорошими кандидатами на переключение, поскольку точное сравнение часто нарушается из-за ошибок округления.Например, 0.11 - 0.1 == 0.01 является ложным.

переключатель на логическом не очень полезен, так как простой if оператор будет проще

if(a) {

} else { 

}

не будет проще с

switch(a) {
  case true:

     break;
  case false:

     break;
}

Кстати: я бы использовал switch (long), если бы он был доступен, но его нет.Это редкий случай для меня.

2 голосов
/ 28 февраля 2011

Для float и double float и double я бы предположил, что они пропустили его по тем же причинам, что и , поэтому плохая идея сравнивать их, используя ==.

Для логического значения это может быть просто потому, что оно в любом случае будет соответствовать выражению if. Помните, что вы можете иметь только константы в выражениях case, поэтому регистры всегда будут соответствовать if (someBool) и if (!someBool).

Для long У меня нет объяснения. Мне кажется, что такая возможность, возможно, должна была быть включена при разработке языка.

1 голос
/ 28 февраля 2011

Обычно структура переключателя используется при выполнении некоторых операций на основе переменной состояния. Там int имеет более чем достаточно вариантов. Boolean имеет только два, поэтому нормальный, если обычно достаточно хорош. Двойные и плавающие числа не настолько точны, чтобы их можно было использовать таким образом.

Честно говоря, я не могу представить вариант использования этого материала, не задумывались ли вы над этим вопросом?

...