在下面的例子中(来自我的课程包),我们想给 Square
实例 c1
一些其他对象的引用 p1
2,但前提是那些是兼容的类型。
if (p1 instanceof Square) {c1 = (Square) p1;}
我在这里不明白的是,我们首先检查 p1
确实是一个 Square
,然后我们仍然投它。如果它是 Square
,为什么投?
我怀疑答案在于明显类型和实际类型之间的区别,但我还是很困惑……
编辑:
编译器将如何处理:
if (p1 instanceof Square) {c1 = p1;}
编辑2:
问题是 instanceof
检查 实际 类型而不是 表面 类型?然后演员表改变了 明显 的类型?
原文由 JDelage 发布,翻译遵循 CC BY-SA 4.0 许可协议
请记住,您始终可以将 Square 的实例分配给继承链上层的类型。然后,您可能希望将不太具体的类型转换为更具体的类型,在这种情况下,您需要确保您的转换是有效的: