繁体   English   中英

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

[英]I have some issue about casting in 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;
    }

但是出现了java.lang.ClassCastException。

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

谢谢

我该如何投放?

你不能 仅当所讨论的对象与类型具有“是”关系时,才可以强制转换。 在您的情况下,您有一个A对象( fn的一个),它不是B (所有B对象都是A ,因为B扩展了A ,但并非所有A对象都是B

试想一下:让我们把B BirdA Animal :一个Bird是一种Animal ,但并非所有的Animal s为Bird秒。 因此我们可以将所有Bird视为Animal ,但是不能将所有Animal视为Bird 当您使用给定类型的变量来引用对象时,您会将对象视为该类型的对象(例如, B b = (B)a试图将Animal a视为Bird )。


旁注:没有指向代码的指示部分:

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

由于下一行将分配给b (好吧,如果可以编译的话),所以做new B()并事先将其分配给b没有任何目的。 (除非B构造函数具有副作用,这通常是Bad Idea™。)

铸造一个特别的目的是另一类型不会奇迹般地将其转换成类的一个实例(或至少在Java中没有 ); 因此,尽管执行b之后B b = new B();引用的对象B b = new B();但是变量a引用的对象没有例如要使用字段subStr B b = new B(); 做。

其他人已经解释了为什么您不能这样做。 我在这里给你一个简单的选择。 您的B类可以有一个以A作为参数的构造函数,您只需将A换行即可,就可以将其“转换”为B。这样,您的代码看起来会更简洁,它实际上会工作,并且您遵循的是好的设计模式。 有关更多信息,请查看装饰器模式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM