Upcast提供ClassCastException

时间:2013-12-20 16:18:21

标签: java classcastexception extends

两个班级:

public class ClassA implements ClassC {
    private static final long serialVersionUID = 1111111111111111111L;
    public String varA;
}

public class ClassB extends ClassA implements ClassC {
    private static final long serialVersionUID = 4604935970051141456L;
    public String varB;
}

在我的代码中,我有这个声明: ClassB classB;

和方法

  

myMethod的()

返回ClassA个对象。

如果我写:

classB = (ClassB) myMethod();

我以为我会:

classB.varA = <a value from myMethod()>
classB.varB = null

但事实并非如此:我收到 ClassCastException

为什么呢?如何快速将myMethod()分配给ClassB

3 个答案:

答案 0 :(得分:1)

问题在于您尝试将ClassA向下转换为ClassB,这是不允许的,因为实际对象可能是ClassX({{1}的另一个子类没有显式转换的。}

请参阅以下示例,该示例将抛出ClassA(但编译得很好):

ClassCastException

代码完美编译:

  • public class Main { public static void main(String[] args) { SubB var = (SubB) someMethod(); } private static Super someMethod(){ return new SubA(); } } class Super { } class SubA extends Super { } class SubB extends Super { } 返回类型为someMethod()的类。
  • Super扩展SubA,因此不会违反方法定义
  • Super扩展SubB,以便将Super类型的对象转换为Super

然而,当你执行此操作时,你会尝试将SubB类型的对象强制转换为SubA,这是不可能的。

图片的标题说明:

  • 请勿使用SubB来命名ClassC
  • 在此类名称中将层次结构放入此类名称(超级&lt; - &gt; Sub)而不是(A&lt; - &gt; B&lt; - &gt; C)

答案 1 :(得分:1)

Java中的强制转换不像dynamic_cast&lt; ...&gt; C ++中的指针。对于后者,如果类型不兼容,则结果为空指针。在Java中,转换不兼容的引用会产生ClassCastException

通常的Java习惯用法是使用instanceof预先测试引用,然后仅在结果为true时执行转换。例如,

ClassA a = myMethod();
if (a instanceof ClassB) {
    ClassB b = (ClassB) a;
    ...
}

答案 2 :(得分:0)

ClassA不是ClassB可互换的。更改方法以返回ClassC(界面),并将该引用存储为ClassC,然后您可以使用ClassAClassB。 A是-A C,B是-A C,但A不是B,即使B是-A A.如果有帮助的话。