有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我对java中的角色转换有一些疑问

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;
    }

但是爪哇。lang.ClassCastException被记录在案

我该怎么投? 我想使用子类变量和超类变量

谢谢!


共 (2) 个答案

  1. # 1 楼答案

    How can I cast this?

    不能。只有当所讨论的对象与类型具有“是”关系时,才能进行强制转换。在您的例子中,有一个A对象(来自fn的对象),它不是B。(所有B对象都是A,因为B扩展了A,但并非所有A对象都是B。)

    考虑一下:让我们调用B{}和A{}:ABird是一个Animal,但并不是所有的Animal都是Bird。所以我们可以将所有的{}都视为Animal,但我们不能将所有的Animal都视为Bird。当使用给定类型的变量引用对象时,您将对象视为该类型(例如,B b = (B)a尝试将Animal{}视为Bird


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

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

    因为下一行赋值给b(如果它会编译的话,它会的),所以只在之前把new B()赋值给b是没有用的。(除非B构造函数有副作用,这通常是个坏主意。)™.)

  2. # 2 楼答案

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