Menu
Coddy logo textTech

Upcasting et Downcasting

Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 30 sur 87.

Dans la leçon précédente, vous avez vu comment une variable de type parent peut contenir un objet enfant : Animal myPet = new Dog(). Cette affectation est appelée upcasting, et elle se produit automatiquement car un Dog est toujours un Animal.

L'upcasting remonte la hiérarchie d'héritage. C'est implicite et toujours sûr :

Dog dog = new Dog();
Animal animal = dog;  // Upcasting - automatique

Lorsque vous effectuez un upcasting, vous ne pouvez accéder qu'aux méthodes définies dans la classe parente. Les méthodes spécifiques à la classe enfant deviennent masquées, même si l'objet est toujours un Dog en réalité.

Le downcasting s'effectue dans le sens inverse, en convertissant une référence parente en un type enfant. Cela nécessite un transtypage explicite car ce n'est pas toujours sûr :

Animal animal = new Dog();  // Upcasting
Dog dog = (Dog) animal;     // Downcasting - transtypage explicite requis
dog.bark();                 // Maintenant, nous pouvons accéder aux méthodes de Dog

Le transtypage descendant (downcasting) est risqué. Si l'objet n'est pas réellement du type vers lequel vous effectuez le transtypage, Java lève une ClassCastException à l'exécution :

Animal animal = new Cat();
Dog dog = (Dog) animal;  // Compile, mais plante à l'exécution !

Le compilateur ne peut pas détecter cette erreur car il ne voit que les types déclarés. Le type réel de l'objet n'est connu que lors de l'exécution du programme. Dans la prochaine leçon, vous apprendrez comment vérifier en toute sécurité le type d'un objet avant d'effectuer un transtypage descendant (downcasting).

challenge icon

Défi

Facile

Construisons un système de lecteur multimédia qui démontre à la fois l'upcasting et le downcasting en action. Vous allez créer une hiérarchie de types de médias et vous entraîner à convertir entre les références parent et enfant.

Vous organiserez votre code sur quatre fichiers :

  • Media.java : Créez la classe de base que tous les types de médias partagent. Chaque élément multimédia possède un champ title (String). Incluez un constructeur pour l'initialiser, une méthode getter getTitle(), et une méthode play() qui affiche : "Playing: " + title
  • Song.java : Créez une classe qui étend Media. Les chansons ont un champ supplémentaire artist (String). Utilisez super pour l'initialisation du parent. Surchargez play() pour afficher : "Playing song: " + title + " by " + artist. Ajoutez une méthode showArtist() qui affiche : "Artist: " + artist
  • Podcast.java : Créez une autre classe qui étend Media. Les podcasts ont un champ episode (int). Surchargez play() pour afficher : "Playing podcast: " + title + " - Episode " + episode. Ajoutez une méthode showEpisode() qui affiche : "Episode: " + episode
  • Main.java : Démontrez l'upcasting et le downcasting avec vos types de médias. Vous recevrez quatre entrées : un titre de chanson, un nom d'artiste, un titre de podcast et un numéro d'épisode.

    Tout d'abord, créez un Song et effectuez un upcasting vers une référence Media. Appelez play() sur cette référence pour voir le polymorphisme au moment de l'exécution à l'œuvre.

    Ensuite, effectuez un downcasting de cette référence Media vers un Song et appelez showArtist() pour accéder à la méthode spécifique à l'enfant.

    Ensuite, créez un Podcast et effectuez un upcasting vers une référence Media. Appelez play() sur cette référence.

    Enfin, effectuez un downcasting de cette référence Media vers un Podcast et appelez showEpisode().

Vous recevrez quatre entrées : le titre de la chanson (String), le nom de l'artiste (String), le titre du podcast (String) et le numéro de l'épisode (int).

Votre sortie devrait afficher quatre lignes - deux pour la chanson (sa sortie de lecture et les informations sur l'artiste) et deux pour le podcast (sa sortie de lecture et les informations sur l'épisode). Remarquez comment l'upcasting vous permet de traiter différents types de médias de manière uniforme, tandis que le downcasting vous permet d'accéder à leurs fonctionnalités uniques !

Aide-mémoire

En Java, le upcasting (transtypage ascendant) remonte la hiérarchie d'héritage et se produit automatiquement. Un objet enfant peut être assigné à une variable de type parent :

Dog dog = new Dog();
Animal animal = dog;  // Upcasting - automatique

Lorsque vous effectuez un upcasting, vous ne pouvez accéder qu'aux méthodes définies dans la classe parente, même si l'objet est toujours du type enfant en réalité.

Downcasting (transtypage descendant) convertit une référence parente en un type enfant. Il nécessite un transtypage explicite :

Animal animal = new Dog();  // Upcasting
Dog dog = (Dog) animal;     // Downcasting - transtypage explicite requis
dog.bark();                 // Maintenant, nous pouvons accéder aux méthodes de Dog

Le downcasting est risqué. Si l'objet n'est pas réellement du type vers lequel vous effectuez le transtypage, Java lève une ClassCastException à l'exécution :

Animal animal = new Cat();
Dog dog = (Dog) animal;  // Compile, mais plante à l'exécution !

Le compilateur ne peut pas détecter cette erreur car il ne voit que les types déclarés. Le type réel de l'objet n'est connu que lors de l'exécution du programme.

Essayez vous-même

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lire les entrées
        String songTitle = scanner.nextLine();
        String artistName = scanner.nextLine();
        String podcastTitle = scanner.nextLine();
        int episodeNumber = scanner.nextInt();
        
        // TODO: Créer une chanson (Song) et effectuer un upcasting vers une référence Media
        
        // TODO: Appeler play() sur la référence Media (démontre le polymorphisme)
        
        // TODO: Effectuer un downcasting de la référence Media vers Song
        
        // TODO: Appeler showArtist() sur la référence Song
        
        // TODO: Créer un Podcast et effectuer un upcasting vers une référence Media
        
        // TODO: Appeler play() sur la référence Media
        
        // TODO: Effectuer un downcasting de la référence Media vers Podcast
        
        // TODO: Appeler showEpisode() sur la référence Podcast
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet