Java:boolean instanceOf Boolean?

18

我有点困惑:我有一个函数,它以对象作为参数。但是编译器如果我只传递一个基本类型的值,甚至识别布尔原语作为布尔对象时也不会抱怨。这是为什么呢?

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
注意,布尔值(boolean)从不是Boolean类的实例。您永远无法将原始数据类型传递给instanceof运算符。您的布尔原始数据类型从未进入过这个方法,在调用发生并进行方法调用转换时才进行了装箱! - Mishax
4个回答

33

因为原始值 'true' 将会被自动装箱Boolean,而它是一个 Object


3
(+1) 这里还有一些与之相关的文档链接:http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html - Tim Stone
进一步阅读:http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html@jpegzz,如果你使用 1.4.x 运行,该代码将无法编译。 - NG.
有趣的 :) 好吧,文档建议只在确实需要时使用自动装箱,所以我不会使用它。但是知道这不是一个错误而是一个特性还是很好的 :) - epegzz
什么是 ------------ if (object instanceof Boolean ) -----------------,那么会发生什么?这意味着什么? - alishaik786
instanceof 运算符检查对象是否是 Boolean 类的实例。 - jmj

3

就像之前的回答所说,这被称为自动装箱。

实际上,在编译时,javac会将您的boolean原始值转换为Boolean对象。请注意,通常情况下,反向转换可能会由于以下代码而生成非常奇怪的NullPointerException

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

您可以查看JDK文档获取更多信息。这些信息与Java编程语言中的自动装箱和拆箱相关。

7
你是不是想表达 Boolean b = null; - mlvljr
1
我认为你想表达的是 Boolean b = null; 而不是 boolean b = null;。请注意大小写。 - Thomas Vos

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

不同于原始代码行为,如果值为null,则会返回“无效”,因为null不是Boolean的实例(你在上面的第一段代码中缺少了那行代码); “dunno”根本不会被返回(由原始代码)。如果没有那行代码,你的第一段代码将在值为null时抛出NPE。 - user85421
@Carlos,我总是记不住instanceof在所有空值的情况下返回true还是false,所以我通常通过事先检查null来避免这种情况。 - Paul Tomblin

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接