在下面的例子中(来自我的课程包),我们想要给Square
实例c1
其他对象的引用p1
,但前提是这两个类型是兼容的。
if (p1 instanceof Square) {c1 = (Square) p1;}
我在这里不明白的是我们首先检查p1
确实是一个Square
,然后我们仍然投射它。如果它是一个Square
,为什么要投?
我怀疑答案在于表面类型和实际类型之间的区别,但我仍然很困惑......
Edit:
编译器将如何处理:
if (p1 instanceof Square) {c1 = p1;}
Edit2:
问题是instanceof
检查actual类型而不是apparent类型?然后演员阵容改变了apparent type?
旧代码将无法正常工作
The 隐含的演员特征毕竟这是合理的,但由于向后兼容性,我们很难将这个 FR 实现到 java。
看看这个:
public class A {
public static void draw(Square s){...} // with implied cast
public static void draw(Object o){...} // without implied cast
public static void main(String[] args) {
final Object foo = new Square();
if (foo instanceof Square) {
draw(foo);
}
}
}
当前的 JDK 将编译第二个声明方法的用法。
如果我们用java实现这个FR,它将编译为使用第一种方法!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)