java:boolean的布尔实例?

java:boolean的布尔实例?,java,casting,boolean,primitive,autoboxing,Java,Casting,Boolean,Primitive,Autoboxing,我有点困惑:我有一个函数,它以一个对象作为参数。但是,如果我只是传递一个基元,甚至将布尔基元识别为布尔对象,编译器不会抱怨。为什么会这样 public String test(Object value) { if (! (value instanceof Boolean) ) return "invalid"; if (((Boolean) value).booleanValue() == true ) return "yes"; if (((Boolean) value).b

我有点困惑:我有一个函数,它以一个对象作为参数。但是,如果我只是传递一个基元,甚至将布尔基元识别为布尔对象,编译器不会抱怨。为什么会这样

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
”将转换为
Boolean
,它是一个
对象

它被称为自动装箱-java 1.5的新功能


方法的这一部分:

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

正如前面的答案所说,它被称为自动装箱

实际上,在编译时,
javac
将把
boolean
primitve值转换为
boolean
对象。请注意,通常,反向转换可能会生成非常奇怪的
NullPointerException
,例如,由于以下代码

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

如果(b==true)(+1),下面是一些进一步的阅读:@jpegzz,如果使用1.4.xinteresting:)那么代码将无法编译。好吧,文档建议仅在确实必要时使用自动装箱,所以我不会。但很高兴知道这不是一个bug,而是一个特性:)如果(布尔对象实例)发生了什么?是什么意思?
instanceof
操作符检查对象是否是布尔类的实例,而不是OP的代码行为
null
将返回“invalid”,因为
null
不是
Boolean
的实例(您在上面的第一个代码中缺少OP代码中的那一行);“dunno”将永远不会被返回(按原始代码)。如果没有这一行,当值为
null
@Carlos时,您的第一个代码将抛出一个NPE,我永远记不起
instanceof
是否返回所有null的true或false,因此我通常通过事先检查null来避免这种情况。您的意思是
布尔b=null?我想你的意思是
布尔b=null
而不是
布尔b=null。注意大写。注意布尔值永远不是布尔值的实例。永远不能将基元传递给instanceof运算符。您的布尔基元从未进入此方法,装箱发生在调用发生和方法调用转换发生时!