Подтвердить что ты не робот

Java: boolean instanceOf Boolean?

Я немного смущен: у меня есть функция, которая принимает объект как аргумент. Но компилятор не жалуется, если я просто передаю примитив и даже признаю булевский примитив как 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"
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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