爪哇;将基类转换为派生类

2022-09-01 21:49:37

为什么我无法将基类实例强制转换为派生类?

例如,如果我有一个扩展了类 C 的 B 类,为什么我不能这样做?

B b=(B)(new C());

还是这个?

C c=new C();
B b=(B)c;

好吧,让我更具体地说明我想要做什么。以下是我所拥有的:

public class Base(){
    protected BaseNode n;
    public void foo(BaseNode x){
        n.foo(x);
    }
}


public class BaseNode(){
    public void foo(BaseNode x){...}
}

现在我想创建一组扩展Base和Basenode的新类,如下所示:

public class Derived extends Base(){
    public void bar(DerivedNode x){
        n.bar(x);//problem is here - n doesn't have bar
    }
}

public class DerivedNode extends BaseNode(){
    public void bar(BaseNode){
        ...
    }
}

因此,从本质上讲,我想通过扩展Base和BaseNode来为它们添加新功能,并为它们添加一个功能。此外,Base和BaseNode应该能够单独使用。

如果可能的话,我真的很想在没有泛型的情况下做到这一点。


好吧,所以我最终弄清楚了,部分归功于Maruice Perry的回答。

在我的构造函数中,被实例化为 .我所要做的就是在构造函数中作为我的派生类重新实例化,并且它可以完美地工作。BasenBaseNodenDerivedNode


答案 1

因为如果B扩展C,则意味着B是C,而不是C是B。

重新思考你想做什么。


答案 2

现有的答案在抽象的论点方面很好,但我想做一个更具体的答案。假设你可以这样做。然后,此代码必须编译并运行:

// Hypothetical code
Object object = new Object();
InputStream stream = (InputStream) object; // No exception allowed?
int firstByte = stream.read();

该方法的实现究竟来自哪里?它在 .它将从哪里获取数据?将裸露视为 .对于演员来说,抛出一个异常要好得多。readInputStreamjava.lang.ObjectInputStream

根据我的经验,让“并行类层次结构”(如您所描述的层次结构)发挥作用是很棘手的。你可能会发现泛型有帮助,但它很快就会变得毛茸茸的。