Menu
Coddy logo textTech

Récapitulatif - Conteneur générique

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

challenge icon

Défi

Facile

Construisons un système de stockage polyvalent qui rassemble tout ce que vous avez appris sur les génériques ! Vous allez créer une classe Container capable de stocker, récupérer et traiter des éléments de n'importe quel type, ainsi que des méthodes utilitaires illustrant l'utilisation des jokers (wildcards).

Vous organiserez votre code sur trois fichiers :

  • Container.java : Créez une classe générique Container<T> qui gère une collection d'éléments. Votre conteneur doit utiliser une ArrayList<T> en interne pour stocker les éléments. Incluez les méthodes add(T item) pour ajouter un élément, get(int index) pour récupérer un élément à une position spécifique, size() pour retourner le nombre d'éléments, et isEmpty() pour vérifier si le conteneur est vide. Ajoutez également une méthode getAll() qui retourne la liste interne.
  • ContainerUtils.java : Créez une classe utilitaire avec des méthodes génériques statiques qui fonctionnent avec vos conteneurs :

    printAll(Container<?> container) - Utilise un joker non borné (unbounded wildcard) pour afficher tous les éléments de n'importe quel conteneur, un par ligne.

    countItems(Container<? extends Number> container) - Utilise un joker avec borne supérieure (upper bounded wildcard) pour calculer la somme de toutes les valeurs numériques du conteneur, en retournant le résultat sous forme de double.

    addDefaults(Container<? super Integer> container) - Utilise un joker avec borne inférieure (lower bounded wildcard) pour ajouter les entiers 1, 2 et 3 à n'importe quel conteneur pouvant accepter des entiers.

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - Une méthode générique qui retourne le dernier élément du conteneur, ou la valeur par défaut si le conteneur est vide.

  • Main.java : Rassemblez votre système de conteneur générique ! Vous recevrez trois entrées : un mot (String), un entier et un double.

    Tout d'abord, créez un Container<String> et ajoutez-y le mot deux fois. Affichez String container: puis utilisez printAll pour afficher son contenu.

    Ensuite, créez un Container<Double> et ajoutez-y la valeur double. Affichez une ligne vide, puis Number sum: [sum] en utilisant countItems.

    Ensuite, créez un Container<Number> et appelez addDefaults sur celui-ci. Affichez une ligne vide, puis After adding defaults: et utilisez printAll pour montrer le contenu.

    Enfin, créez un Container<Integer> vide et utilisez getLastOrDefault avec votre entier en entrée comme valeur par défaut. Affichez une ligne vide, puis Last or default: [result].

Vous recevrez trois entrées dans l'ordre : un mot (String), un entier et un double.

Ce défi combine les classes génériques, les méthodes génériques, les paramètres de type bornés et les trois types de jokers. Remarquez comment chaque élément remplit un rôle différent : la classe générique fournit un stockage sécurisé au niveau des types, les jokers bornés permettent une lecture et une écriture flexibles, et les méthodes génériques offrent des opérations réutilisables sur différents types de conteneurs !

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 word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: Créer un Container<String> et ajouter le mot deux fois
        // Afficher "String container:" puis utiliser ContainerUtils.printAll()
        
        // TODO: Créer un Container<Double> et ajouter la valeur double
        // Afficher une ligne vide, puis "Number sum: [sum]" en utilisant ContainerUtils.countItems()
        
        // TODO: Créer un Container<Number> et appeler ContainerUtils.addDefaults() dessus
        // Afficher une ligne vide, puis "After adding defaults:" et utiliser ContainerUtils.printAll()
        
        // TODO: Créer un Container<Integer> vide
        // Utiliser ContainerUtils.getLastOrDefault() avec intValue comme valeur par défaut
        // Afficher une ligne vide, puis "Last or default: [result]"
    }
}

Toutes les leçons de Programmation Orientée Objet