Java动态类强制转换

时间:2014-11-19 03:37:40

标签: java dynamic casting

我知道这可能是重复的,但其他线程并没有完全解决我的问题。

让我们说我有以下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)

你能告诉我为什么吗?

3 个答案:

答案 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