Ява: логический логический оператор instanceof?


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

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"
4 13

4 ответа:

Потому что примитивное 'true ' будет Автобоксинг к Boolean и который является Object.

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

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

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

Вы можете посмотреть на документацию JDK для получения дополнительной информации.

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

  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";

Его называют autoboxing-new С java 1.5

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