java - 为什么我不能将嵌套类分配给它的父类?
问题描述
给出以下代码
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:错误。
解决方案
您需要考虑编译时类型信息。即使您可以分辨出它B
是 anA
并且C
来自 is 的引用返回是编译器f()
的一个实例,B
但编译器只知道从f()
implementC
返回的对象。推断任何具体类型都是错误的。毕竟,你可以返回任何具体类型,f()
只要它实现了C
. instanceof
您可以通过调用和/或强制转换实例来手动检查,A a = (A) new A().f();
但这通常不是一个好主意。C
如果您想添加其他实现,它将使您的代码中断。
推荐阅读
- c - 跳过字数,位于字符串中,由一个参数指示
- airflow - 气流 1.9 到 1.10 升级,现在我在 UI 中得到空日志
- firebase - Firebase 仪表板设置电子邮件已验证
- c - 使用 Cordic 进行数模转换
- python - 为什么这个 Python 脚本在 CPU 中比在 GPU 中运行得更快?
- ios - 无法在 IntelliJ Idea 上安装 RoboVM 插件
- c++ - 网络套接字创建问题
- python - 附加 tf.ones 和 tf.zeros(张量流)
- javascript - 子组件的 v-model 和子组件 Vue 内的 v-model
- java - Java 正则表达式拆分单词、标点符号、空格、换行但保持收缩?