java - 尝试强制转换子类时出现 ClassCastException
问题描述
我有这个代码:
package Maven_test.Maven_project_test;
public class Test {
class A {
int i = 10;
}
class B extends A {
int j = 20;
}
class C extends B {
int k = 30;
}
public void pruebaJerarquia() {
A a = new B();
B b = (B) a;
C c = (C) b;
System.out.println(c.k);
}
}
我想知道为什么这条线:
C c = (C) b;
执行程序时抛出此异常:
Exception in thread "main" java.lang.ClassCastException:
Maven_test.Maven_project_test.Test$B cannot be cast to
Maven_test.Maven_project_test.Test$C
at Maven_test.Maven_project_test.Test.pruebaJerarquia(Test.java:21)
at Maven_test.Maven_project_test.App.main(App.java:10)
我认为这与向上转换和向下转换有关,但我不明白。可能是因为“b”指向“a”,而“C c = (C) b”就像试图投射这样的东西?
C c = new A();
谢谢!
解决方案
您正在创建一个类型为 的对象B
。根据您的类层次结构,每个B
对象也是一个A
,但不是一个C
.
现在让我们看看如何将对该B
对象的引用分配给各种变量:
Object o = new B(); // You can always assign references to an Object-typed variable.
A a = (A) o; // This works because the object is of type A.
B b = (B) o; // This works because the object is of type B.
C c = (C) o; // This does not work because the object is not of type C.
推荐阅读
- php - 网站无法在 iPad 或 iPhone 上加载,但在其他任何地方都加载得很好
- javascript - Constructor Function vs Object.create - 有什么区别和应用?
- oracle - 当我从 oracle 填充数据时,为什么 $dataset.tables[0] powershell 为空?
- javascript - 使用字符串 [] 数组作为参数从 Javascript 获取字符串索引值到 MVC C# 控制器
- erlang - Erlang :ssh 认证错误。如何使用身份文件连接到 ssh
- ios - 为什么 UITableView contentOffset 在 tableview reloadData 期间变化很大,而不是保持不变?reloadData 后如何使其保持不变?
- arrays - 用于存储先前值(并刷新它们)的正确代码
- scilab - Scilab中for循环内的矩阵乘法
- python - 使用 lxml 和 python 请求进行抓取。
- opencl - 如何在主机程序循环中使用 opencl?