Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从对象到布尔值的转换是否是有效的Java语言?_Java_Language Specifications - Fatal编程技术网

从对象到布尔值的转换是否是有效的Java语言?

从对象到布尔值的转换是否是有效的Java语言?,java,language-specifications,Java,Language Specifications,我在工作中偶然发现了一个多年前由一个C程序员实现的旧Java代码,我们不得不开始讨论该代码是否是有效的Java代码,即使它可以编译并工作 final Object o = Boolean.TRUE; boolean b = (boolean) o; 这基本上就是所讨论的代码。正如您所看到的,从对象到原始布尔值的转换不太好,这应该是不可能的,但由于一些隐式的拳击魔术,它碰巧可以工作 如果我这样做 final Object o = Boolean.TRUE; if (o instanceof Bo

我在工作中偶然发现了一个多年前由一个C程序员实现的旧Java代码,我们不得不开始讨论该代码是否是有效的Java代码,即使它可以编译并工作

final Object o = Boolean.TRUE;
boolean b = (boolean) o;
这基本上就是所讨论的代码。正如您所看到的,从对象到原始布尔值的转换不太好,这应该是不可能的,但由于一些隐式的拳击魔术,它碰巧可以工作

如果我这样做

final Object o = Boolean.TRUE;
if (o instanceof Boolean) {
  b = (boolean) o;
}
我甚至在o被强制转换为b的那一行得到警告,说“强制转换与给定的instanceof不兼容”。这显然是正确的,但由于隐式拳击,它仍然有效

现在的问题是:Java规范是否允许这种强制转换,因此应该与未来的JVM版本一起使用?或者它只是碰巧在当前版本中工作,在将来的JVM更新中可能不再工作?

是。这是合法的。看哪一个说(部分)

取消装箱转换将引用类型的表达式转换为基元类型的相应表达式。具体而言,以下八种转换称为取消装箱转换:

  • 从布尔类型到布尔类型
这是在中定义的。它特别允许从
对象
到基元类型(另见表5.5-a)的取消装箱转换进行强制转换。联合联络小组特别指出:

引用类型的表达式可以通过取消装箱转换进行转换为基元类型的强制转换,而不会出错


有关更多详细信息,请参阅我对类似问题的回答:

非常好的报价,谢谢。但是,所讨论的强制转换源是Object类型,而不是Boolean。@two
对象
是引用类型。在运行时,所有实例的类型也都是
Object
。相关: