为什么不能将基类实例转换为派生类?
例如,如果我有一个扩展了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" );
}
}