首页 > 解决方案 > 为什么我不能将嵌套类分配给它的父类?

问题描述

给出以下代码

interface C {
  void g();
}

class A {
  int x = 1;

  C f() {
    int y = 1;

    class B extends A implements C {
      public void g() {
        A.this.x = y; // accessing x and y is OK.
      }
    }
    B b = new B();
    return b;
  }
}

我尝试运行以下命令行:

A a = new A().f();

但是,它会抛出一个不兼容的类型错误,即 C 无法转换为 A。

我不明白为什么这会引发错误,因为我正在阅读的文本正在执行以下命令:

A a = new A();
C b = a.f();
b.g();

他们提到:

现在调用上面的命令会给我们一个 B 类型对象的引用

这种行为的原因可能是什么?

编辑:我在 jshell 上运行了以下代码。

编辑2:错误。

标签: java

解决方案


您需要考虑编译时类型信息。即使您可以分辨出它B是 anA并且C来自 is 的引用返回是编译器f()的一个实例,B 但编译器只知道从f()implementC返回的对象。推断任何具体类型都是错误的。毕竟,你可以返回任何具体类型,f()只要它实现了C. instanceof您可以通过调用和/或强制转换实例来手动检查,A a = (A) new A().f();但这通常不是一个好主意。C如果您想添加其他实现,它将使您的代码中断。


推荐阅读