我有点困惑:我有一个函数,它将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"
答案 0 :(得分:31)
因为原始的“true
” Autoboxed 到Boolean
,而Object
。
答案 1 :(得分:3)
就像以前的答案所说的那样,它被称为自动装箱。
实际上,在编译时,javac
会将您的boolean
原始值转换为Boolean
对象。请注意,通常,反向转换可能会产生非常奇怪的NullPointerException
,例如,由于以下代码
Boolean b = null;
if(b==true) <<< Exception here !
您可以查看JDK documentation了解更多信息。
答案 2 :(得分: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";
答案 3 :(得分:1)
它被称为autoboxing - java 1.5的新功能
http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html