我有一些关于在java中进行转换的问题

时间:2016-07-17 11:50:22

标签: java casting

public class A {
    private String superStr;

    public String getSuperStr() {
        return superStr;
    }

    public void setSuperStr(String superStr) {
        this.superStr = superStr;
    }   
}
public class B extends A {
    private String subStr;

    public String getSubStr() {
        return subStr;
    }

    public void setSubStr(String subStr) {
        this.subStr = subStr;
    }   
}

我希望结果低于

    public static void main(String[] args) {

        A a = fuc();

        B b = new B();

        b = (B) a;

        b.setSubStr("subStr");

        System.out.println(a.getSuperStr() +  b.getSubStr());       
    }

    private static A fuc() {
        A  a = new A();
        a.setSuperStr("super");

        return a;
    }

但是java.lang.ClassCastException是ocuured。

我该如何投这个? 我想使用子类变量和超类变量。

谢谢

3 个答案:

答案 0 :(得分:2)

  

我该如何投这个?

你做不到。只有在相关对象与类型具有“是”关系时才能进行投射。在您的情况下,您有一个A对象(来自fn的对象),而不是B。 (所有B个对象都是A个,因为B扩展了A,但并非所有A个对象都是B s。)

考虑:让我们致电B BirdA AnimalBirdAnimal,但不是全部Animal } s是Bird s。因此,我们可以将所有Bird视为Animal,但我们无法将所有Animal视为Bird。当您使用给定类型的变量来引用对象时,您将对象视为该类型(例如,B b = (B)a尝试处理Animal a作为Bird)。

旁注:代码中指出的部分没有意义:

B b = new B();
// ^^^^^^^^^^
b = (B) a;

由于下一行分配给b(好吧,如果它可以编译),执行new B()并且事先将其分配给b没有任何目的。 (除非B构造函数有副作用,这通常是一个坏主意™。)

答案 1 :(得分:0)

Casting对另一种类型的特定对象不会神奇地将其转换为该类的实例(或至少not in Java);因此,变量a引用的对象不例如尽管subStr执行b后引用的对象确实存在,但仍要使用字段B b = new B();

答案 2 :(得分:0)

其他人已经解释了为什么你不能这样做。我在这里给你一个简单的选择。你的B类可以有一个带有A as参数的构造函数,你只需要包装那个A,这样就可以"转换"使用它你的代码会看起来更干净,它实际上会工作,你遵循一个良好的设计模式。有关更多信息,请查看Decorator Pattern