java: boolean instanceOf Boolean?

Я немного сбит с толку: у меня есть функция, которая принимает Object в качестве аргумента. Но компилятор не жалуется, если я просто передаю примитив, и даже распознает логический примитив как Boolean Object. Почему это так?

public String test(Object value)
{
   if (! (value instanceof Boolean) ) return "invalid";
   if (((Boolean) value).booleanValue() == true ) return "yes";
   if (((Boolean) value).booleanValue() == false ) return "no";
   return "dunno";
}

String result = test(true);  // will result in "yes"
15
задан Gopi 16 September 2010 в 10:45
поделиться

4 ответа

Потому что примитив 'true' будет Autoboxed в Boolean и является Object.

32
ответ дан 1 December 2019 в 01:10
поделиться

это называется autoboxing - новое в Java 1.5

http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

1
ответ дан 1 December 2019 в 01:10
поделиться

Как сказано в предыдущих ответах, это называется автоупаковкой.

Фактически, во время компиляции javac преобразует ваше логическое значение-примитив в логическое объект. Обратите внимание, что обычно обратное преобразование может генерировать очень странные NullPointerException из-за, например, следующего кода

Boolean b = null;
if(b==true) <<< Exception here !

. Дополнительную информацию можно найти в документации JDK.

3
ответ дан 1 December 2019 в 01:10
поделиться

Эта часть метода:

  if (((Boolean) value).booleanValue() == true ) return "yes";
  if (((Boolean) value).booleanValue() == false ) return "no";
  return "dunno";

Можно заменить на

  if (value == null) return "dunno";
  return value ? "yes" : "no";
2
ответ дан 1 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: