Java; casting de la classe de base de la classe dérivée

Pourquoi ne puis-je pas jeté une classe de base instance d'une classe dérivée?

Par exemple, si j'ai une classe B qui s'étend d'une classe C, pourquoi ne puis-je pas le faire?

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

ou cela?

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

Bien, permettez-moi d'être plus précis quant à ce que je suis en train de faire. Voici ce que j'ai:

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


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

Maintenant, je veux créer un nouvel ensemble de classes qui s'étendent de la Base et Basenode, comme ceci:

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){
        ...
    }
}

Donc, essentiellement, je veux ajouter de nouvelles fonctionnalités à la Base et aux BaseNode en les étendant à la fois, et d'ajouter une fonction à la fois d'entre eux. En outre, la Base et la BaseNode devrait être en mesure d'être utilisé sur leur propre.

J'aimerais vraiment le faire sans les génériques si possible.


Bon alors j'ai fini par essayer de le comprendre, en partie grâce à Maruice Perry réponse.

Dans mon constructeur pour Base, n est instancié comme un BaseNode. Tout ce que j'avais à faire était de ré-instancier n comme un DerivedNode dans ma classe dérivée dans le constructeur, et il fonctionne parfaitement.

Tout d'abord, vous avez besoin de faire BaseNode n; protégés de façon à ce que le Dérivé peut le voir.
Oups (modifié).
Je veux dire n'est-il pas un moyen de faire cela sans les génériques? Comme je l'ai dit je veux que les classes de base pour être utilisable en tant que-est - l'ajout de médicaments génériques permettrait de les rendre plus difficiles à utiliser, et supprime l'encapsulation de la BaseNode classe qui est censé être encapsulé par la Base.

OriginalL'auteur Cam | 2010-04-03