为什么要在实例之后强制转换?旧代码将无法正常工作

2022-09-01 12:44:04

在下面的示例(来自我的课程包)中,我们希望为实例提供其他对象的引用,但前提是这2个是兼容的类型。Squarec1p1

if (p1 instanceof Square) {c1 = (Square) p1;}

我不明白的是,我们首先检查它确实是一个,然后我们仍然投射它。如果是,为什么投?p1SquareSquare

我怀疑答案在于表观类型和实际类型之间的区别,但我仍然感到困惑......

编辑:
编译器将如何处理:

if (p1 instanceof Square) {c1 = p1;}

Edit2:
问题是检查实际类型而不是表面类型吗?然后演员表改变了表观类型?instanceof


答案 1

旧代码将无法正常工作

隐含的强制转换功能毕竟是合理的,但是由于向后兼容性,我们很难将此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,它将编译为使用第一种方法!


答案 2