2010-08-30 5 views
12

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

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" 
+2

Обратите внимание, что логическое значение НИКОГДА не является экземпляром булева. Вы никогда не сможете передать примитиву оператору instanceof. Ваш логический примитив никогда не вводил этот метод, бокс произошел, когда произошел вызов и произошла конверсия вызова метода! – Mishax

ответ

29

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

+3

(+1) И вот несколько [документации, чтобы согласиться с этим] (http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html) –

+0

Дополнительная литература: http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html @jpegzz, код не будет компилироваться, если вы работаете с 1.4.x –

+0

интересным :) Ну, документы предлагают только используйте autoboxing, если действительно необходимо, поэтому я не буду. Но приятно знать, что это не ошибка, а функция :) – epegzz

2

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

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

не таким же, как поведение кода OP. 'null' возвращает« invalid », поскольку« null »не является экземпляром' Boolean' (вам не хватает этой строки из кода OP в вашем первом коде выше); «dunno» никогда не будет возвращен вообще (по оригинальному коду). Без этой строки ваш первый код будет бросать NPE, когда значение равно «null». –

+0

@ Карлос, я никогда не могу вспомнить, возвращает ли 'instanceof' значение true или false со всеми значениями null, поэтому я обычно избегаю случая, предварительно проверив null. –

3

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

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

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

Вы посмотрите на JDK documentation для более подробной информации могут.

+7

Вы имели в виду 'Boolean b = null;' ?? – mlvljr

+1

Я думаю, вы имели в виду 'Boolean b = null;' вместо 'boolean b = null;'. Обратите внимание на капитал. –