web-dev-qa-db-fra.com

Conversion d'un objet de la classe parente à l'enfant

J'ai un malentendu à propos de la conversion en langage Java. Le problème est ClassCastException. Par exemple, dans ce code, supposons que Animal soit la classe parente de la classe Dog,

Animal animal = nouvel animal ();
Chien chien = animal (chien);

jette ClassCastException après exécution. Cependant, en étudiant les packages Android, j’ai trouvé un exemple de conversion de type qui devrait jeter un ClassCastException, en considérant cet exemple Java. 

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

Dans ce code, findViewById méthode retourne un Vue objet de classe, qui est l'une des superclasses de Éditer le texte classe. Android.view.View à Android.widget.EditText) Le code fonctionne bien. Quelqu'un pourrait-il expliquer si j'ai commis une erreur ou comment cela se produit?

Merci d'avance.

11
mwb

Une fois que vous créez un objet, vous ne pouvez pas changer son type. C'est pourquoi vous ne pouvez pas lancer un animal sur un chien.

Toutefois, si vous créez un objet d'une sous-classe, vous pouvez conserver une référence à celui-ci dans une variable du type super-classe. Vous pouvez ensuite le convertir en type de sous-classe.

Cela fonctionnera:

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

Dans l'exemple Android, vous avez une ressource de mise en page qui ressemble à ceci:

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

Cette définition entraînera Android à créer une instance de EditText. Par conséquent, vous pouvez convertir la vue renvoyée par findViewById en EditText. Vous ne pouvez pas le lancer sur autre chose qui n'est pas un super-type de EditText.

13
Eran

Fondamentalement, vous ne pouvez pas convertir une instance d'une super-classe en une sous-classe, car l'instance d'une sous-classe n'est pas encore connue. La diffusion en amont est un moyen sûr d'empêcher cette exception car nous traitons maintenant le polymorphisme de notre code.

Vous devez d'abord créer une sous-classe:

Dog dog = new Dog;

Nous pouvons cacher les méthodes de la classe Dog non trouvée à sa classe parente Animal en le lançant dans sa superclasse:

Animal animal = (Animal) dog;

Vous pouvez ensuite redéfinir ceci dans votre sous-classe Dog car l'instance de sa sous-classe est déjà connue:

Dog anotherDog = (Dog) animal;
2
Ritchie Borja

Vous pouvez essayer ceci:

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

J'espère que cela aidera.

0
Yash