为什么不能将基类实例转换为派生类?

例如,如果我有一个扩展了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添加新功能。此外,Base和BaseNode应该能够单独使用。

如果可能的话,我真的很想在没有泛型的情况下执行此操作。

好吧,所以我最终想出了办法,部分要归功于Maruice Perry的回答。

在我的Base构造函数中,n实例化为BaseNode。我要做的就是在构造函数的派生类中重新实例化n作为DerivedNode,并且效果很好。

最佳答案

您需要使用关键字的实例来检查所引用的对象的类型,并对该对象进行类型转换,并调用 bar()方法。 checkout Derived.bar()方法如下

public class Test{
    public static void main(String[] args){
        DerivedNode dn = new DerivedNode();
        Derived d = new Derived(dn);
        d.bar( dn );
    }
}

class Base{
    protected BaseNode n;
    public Base(BaseNode _n){
        this.n = _n;
    }

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


class BaseNode{
    public void foo(BaseNode x){
        System.out.println( "BaseNode foo" );
    }
}

class Derived extends Base{
    public Derived(BaseNode n){
        super(n);
    }

    public void bar(DerivedNode x){
        if( n instanceof DerivedNode ){
            // Type cast to DerivedNode to access bar
            ((DerivedNode)n).bar(x);
        }
        else {
            // Throw exception or what ever
            throw new RuntimeException("Invalid Object Type");
        }
    }
}

class DerivedNode extends BaseNode{
    public void bar(BaseNode b){
        System.out.println( "DerivedNode bar" );
    }
}

07-24 09:30