Java: логический экземпляр Boolean? - PullRequest
14 голосов
/ 30 августа 2010

Я немного запутался: у меня есть функция, которая принимает 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"

Ответы [ 4 ]

31 голосов
/ 30 августа 2010

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

3 голосов
/ 30 августа 2010

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

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

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

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

2 голосов
/ 30 августа 2010

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

  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";
1 голос
/ 30 августа 2010

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

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

...