Ответ 1
Поскольку примитивный 'true
' будет Autoboxed до 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"
Поскольку примитивный 'true
' будет Autoboxed до Boolean
и который является Object
.
Как и в предыдущих ответах, это называется autoboxing.
Фактически, во время компиляции javac преобразует ваше значение boolean
primitve в объект 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 - новый с java 1.5
http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html