我知道这可能是重复的,但其他线程并没有完全解决我的问题。
让我们说我有以下A和B类扩展BasicClass。
public abstract class BasicClass {
// ...
}
public class A extends BasicClass {
// ...
}
public class B extends BasicClass {
// ...
}
现在我想动态地将A类投射到B.
a.getClass().cast(bClass.newInstance);
但每次我得到一个例外。
java.lang.ClassCastException
at java.lang.Class.cast(Unknown Source)
你能告诉我为什么吗?
答案 0 :(得分:4)
因为,在您的继承层次结构中,B
不是A
。你不能把一个投射到另一个。
答案 1 :(得分:1)
因为A没有延伸B.(技术:A不是B)
JVM执行" IS-A"在施法之前进行测试。 如果" IS-A"测试失败,你会得到" ClassCastException"。(就像你现在得到的那样)。
IS-A: IS-A测试是检查一个类(在你的情况A中是否被转换)是否在类的继承树中(在你的情况下为B)。
IS-A是功能术语,检查IS-A测试的语法是实例"。
例如b的实例:
实例解释:
LHS和RHS的实例必须是对象。
因此a和b是对象。
检查他们各自的类继承。
b的实例:错误
basicof的实例:True
b instanceof a:False
b instanceof basicObject:True
basicObject instanceof a:False
basicObject instanceof b:False
您只能在instanceof的结果为true的情况下进行投射。
答案 2 :(得分:0)
您的层次结构如下所示:
BasicClass
/ \
/ \
A B
A
不是B
的祖先,因此无法将B
的实例投射到A
。