it-swarm.com.de

Typumsetzung eines Objekts von einer übergeordneten Klasse in eine untergeordnete Klasse

Ich habe ein Missverständnis bezüglich der Typumwandlung in Java. Das Problem ist ClassCastException. In diesem Code wird beispielsweise angenommen, dass Animal die übergeordnete Klasse der Dog-Klasse ist.

Tier Tier = neues Tier ();
Hund Hund = (Hund) Tier;

wirft ClassCastException Nach der Ausführung. Beim Studieren von Android-Paketen habe ich jedoch ein Beispiel über Typecasting gefunden, das einen werfen soll ClassCastExceptionunter Berücksichtigung dieses Java-Beispiels. 

EditText editText = (EditText) findViewById (R.id.edit_message);

In diesem Code findViewById Methode gibt a zurück Aussicht Klassenobjekt, das eine der Oberklassen von ist Text bearbeiten Klasse (von Android.view.View zu Android.widget.EditText) Der Code läuft einwandfrei. Könnte jemand erklären, ob ich einen Fehler gemacht habe oder wie das passiert?

Danke im Voraus.

11
mwb

Nachdem Sie ein Objekt erstellt haben, können Sie seinen Typ nicht mehr ändern. Deshalb kann man einem Hund kein Tier werfen.

Wenn Sie jedoch ein Objekt einer Unterklasse erstellen, können Sie einen Verweis darauf in einer Variablen des Oberklassentyps beibehalten und später in den Unterklassentyp umwandeln.

Das wird funktionieren :

Animal a = new Dog ();
Dog d = (Dog) a;

Im Android-Beispiel haben Sie eine Layoutressource, die wie folgt aussieht:

<EditText
    Android:id="@+id/edit_message"
 ..."/>

Diese Definition bewirkt, dass Android eine Instanz von EditText erstellt. Daher können Sie die von findViewById zurückgegebene Ansicht in EditText umwandeln. Sie können es nicht in etwas anderes umwandeln, das kein Supertyp von EditText ist.

13
Eran

Grundsätzlich können Sie eine Instanz einer Oberklasse nicht in eine Unterklasse umwandeln, da die Instanz einer Unterklasse noch nicht bekannt ist. Upcasting ist ein sicherer Weg, um diese Ausnahme zu verhindern, da wir jetzt mit unserem Code Polymorphismus behandeln.

Sie müssen zuerst eine Unterklasse erstellen:

Dog dog = new Dog;

Wir können die Methoden der Klasse Dog, die nicht in der übergeordneten Klasse Animal gefunden wurde, verbergen, indem wir sie in ihre Oberklasse einfügen:

Animal animal = (Animal) dog;

Dann können Sie dies auf Ihre Unterklasse Dog zurückverweisen, da die Instanz ihrer Unterklasse bereits bekannt ist:

Dog anotherDog = (Dog) animal;
2
Ritchie Borja

Sie können dies versuchen:

Base obj= new Derived();
Derived obj2= (Derived)obj;

Hoffe das wird helfen.

0
Yash