在Java中,布尔强制转换是无用的吗?
我看到布尔值的显式转换语法在语法上是合法的,但我想不出它的用途。相应的布尔对象(或者更确切地说,是在布尔值和布尔值之间来回转换)由自动装箱处理。因此,它似乎是编译器的无用语言工件。是否有我缺少的功能方案?(boolean)
我看到布尔值的显式转换语法在语法上是合法的,但我想不出它的用途。相应的布尔对象(或者更确切地说,是在布尔值和布尔值之间来回转换)由自动装箱处理。因此,它似乎是编译器的无用语言工件。是否有我缺少的功能方案?(boolean)
当调用重载方法时,它可能会有所不同。由于要调用的方法由参数的静态类型确定(请参阅 JLS, §15.12.2),因此将 a 强制转换为 a 或反之亦然,可以更改调用的方法:Boolean
boolean
class Ideone {
public static void main (String[] args) {
final Boolean b = true;
foo((boolean) b); // prints out "primitive"
foo(b); // prints out "wrapper"
}
public static void foo(boolean b) {
System.out.println("primitive");
}
public static void foo(Boolean b) {
System.out.println("wrapper");
}
}
请注意,当从 强制转换为 时,当 的值为 时可能会出现 。Boolean
boolean
NullPointerException
Boolean
null
然而,这种行为是否被(广泛)使用或应该被使用是另一个争论。
rzwitserloot在他们的答案中展示了另一个案例。虽然rzwisterloot的情况看起来很相似,但潜在的机制是不同的,因为在JLS中,向下转换的to是单独定义的。此外,它容易出现 a (如果 不是 a) 以及 a (如果 是 )。boolean
Object
Object
boolean
ClassCastException
Object
Boolean
NullPointerException
Object
null
不完全是。
通常,将强制转换运算符与基元类型一起应用只有一个目的,即将一个基元类型转换为另一个基元类型。 是唯一一个具有以下属性的基元类型:任何内容都不能转换为布尔值,并且布尔值不能转换为其他任何内容。boolean
但是,这些还有第二个目的,尽管它在JLS中没有完全阐明,并且是一种可疑的代码样式实践:它有效地导致触发自动取消装箱。它甚至结合了触发自动解箱的工作和普通的类型转换:
Object o = true;
boolean b = (boolean) o;
o = "Hello";
b = (boolean) o;
编译刚刚好。正如预期的那样,它将在第 4 行上导致 ClassCastException。如果没有布尔强制转换,则必须执行如下操作:
boolean b = ((Boolean) o).booleanValue();
这绝对更冗长。确切地说,你最终想要将一些类型的表达式转换为的频率 - 这可能是一个非常罕见的情况,但它是真实的,不允许会使JLS更长,而不是更短(javac代码库也不会更短)。Object
boolean
(boolean)