Ява: логический логический оператор 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 ответа:
Потому что примитивное '
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