我很困惑。
假设我们有以下课程:
class Shape { /* ... */ }
class Square extends Shape { /* ... */ }
什么是最终的布尔值,为什么会这样呢?
Shape shape = ...;
boolean b1 = shape instanceof Square;
Square square = ...;
boolean b2 = ((Shape) square) instanceof Square;
boolean b3 = shape instanceof Object;
据我所知,子类是父类的实例,但不是相反?
答案 0 :(得分:7)
在此代码中:
Number n = new Integer(42);
Number
是n
的明显类型,而Integer
是真实类型。
强制转换更改明显类型,而instanceof
则检查真实类型。
因此,施法对instanceof
结果没有影响。
答案 1 :(得分:2)
请参阅language spec:
在运行时,如果 RelationalExpression 的值不是
instanceof
并且引用可以转换为true
,则null
运算符的结果为ClassCastException
ReferenceType 而不会引发instanceof
。否则结果是错误的。
因此,b1
不会受到强制转型的影响:它会检查是否可以投射运行时值;运行时值本身不受强制转换的影响,它所做的就是告诉编译器“信任你”#34;类型转换是安全的。
所以,三个布尔是:
false
:
shape = null
如果您分配了true
; shape = new Square();
false
shape = new Shape();
如果您指定了Shape
,或b2
的任何其他子类。false
:
square = null
如果您分配了true
; Shape
否则,因为演员没有创建一个新的" b3
。false
:
shape = null
如果您分配了true
; Object
否则,因为引用类型的每个非null实例都可以转换为Object
/分配给O(n)
类型的变量。