Retour au cours

Polymorphisme 2 : Comprendre le Transtypage (Casting)

Maîtrise de Java : De Zéro à Développeur Professionnel (Un parcours en 50 leçons)

Leçon 23 : Polymorphisme 2 : Comprendre le Transtypage

Lors de l'utilisation de références polymorphes, Java restreint l'accès aux seules méthodes définies dans le type de référence (la classe parente). Pour accéder aux méthodes spécifiques à l'objet enfant réel, nous devons utiliser le transtypage.

1. Upcasting (Implicite)

Assigner un objet d'une sous-classe à une variable de référence de super-classe est appelé upcasting. C'est sûr et automatique car la sous-classe est garantie de posséder tous les membres de la super-classe.

java class Manager extends Employee { /* ... */ }

Employee emp = new Manager(); // L'upcasting se produit implicitement

2. Downcasting (Explicite)

Assigner une référence de super-classe à une variable de référence de sous-classe nécessite un transtypage explicite. C'est potentiellement risqué, car vous pourriez essayer de transtyper un objet parent générique en un type d'enfant spécifique qu'il n'est pas.

java Employee emp2 = new Manager();

// Downcasting : Nous disons explicitement au compilateur que nous savons que c'est un Manager. Manager mgr = (Manager) emp2; // Maintenant 'mgr' peut accéder aux méthodes spécifiques de Manager

// Exemple de mise en garde : Employee emp3 = new Employee(); // Manager badMgr = (Manager) emp3; // ERREUR À L'EXÉCUTION ! ClassCastException

3. Vérification du type d'objet (instanceof)

Avant de procéder à un downcasting, vous devriez toujours vérifier le type d'objet réel à l'aide de l'opérateur instanceof afin d'éviter une ClassCastException.

java Vehicle v = new Truck(); // v est en réalité un Truck

if (v instanceof Truck) { System.out.println("L'objet est un Truck, le downcast est sûr."); Truck t = (Truck) v; t.loadCargo(); // Accède à la méthode spécifique de Truck } else { System.out.println("L'objet n'est pas un Truck."); }

Note sur le Java Moderne (JDK 16+) : Java a introduit le filtrage par motif (pattern matching) pour instanceof, ce qui simplifie l'étape de downcasting :

java if (v instanceof Truck t) { // 't' est automatiquement casté si c'est vrai t.loadCargo(); }