继承类的Classcastexception

时间:2015-02-14 22:17:13

标签: java inheritance interface classcastexception

我有这样的类结构:

Interface A extends X
Class A_Impl implements A

Interface B extends A
Class B_Impl extends A_Impl implements B

我的webservice客户端返回A的对象,我需要来自B的一些参数。所以我这样做:

A myA = (A) webservice.getA();
B myB = (B) myA;

但是这总是抛出ClassCast异常:

java.lang.ClassCastException: A_Impl cannot be cast to B

我在这里做错了吗?我如何从B班获得一些参数。

2 个答案:

答案 0 :(得分:1)

当您拥有B的超类型B的实例或除A以外的任何子类型时,您无法获得B的任何属性。例如,如果您想获得属于x成员的字段B的值,但您的对象只是A,则该字段甚至不会出现在对象中。那么它的价值是什么?这就是你不能朝这个方向发展的原因。如果您不想像B的实例一样访问该对象,则必须将webservice.getA()更改为实际返回B(或B_Impl)<的内容/ p>

答案 1 :(得分:1)

如果您对未实现B的对象有引用,则无法将其强制转换为B。完全停止。

想象一下,如果 可能。那打印什么呢?

interface A {
    int getNumberOfLives();
}

interface B extends A {
    boolean isOrange();
}

class A_Impl implements A {
    int getNumberOfLives() {return 9;}
}

public class Main {
    public static void main(String[] args) {
        A a = getA();
        B b = (B)a;
        System.out.println(b.isOrange() ? "Is orange" : "Is not orange");
    }

    static A getA() {return new A_Impl();}
}