Menu
Coddy logo textTech

Resumen - Contenedor genérico

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 58 de 87.

challenge icon

Desafío

Fácil

¡Vamos a construir un sistema de almacenamiento versátil que reúna todo lo que has aprendido sobre genéricos! Crearás una clase Container que pueda almacenar, recuperar y procesar elementos de cualquier tipo, junto con métodos de utilidad que demuestren los comodines (wildcards) en acción.

Organizarás tu código en tres archivos:

  • Container.java: Crea una clase genérica Container<T> que gestione una colección de elementos. Tu contenedor debe usar un ArrayList<T> internamente para almacenar los elementos. Incluye métodos para add(T item) un elemento, get(int index) para recuperar un elemento en una posición específica, size() para devolver la cantidad de elementos e isEmpty() para verificar si el contenedor no tiene elementos. También añade un método getAll() que devuelva la lista interna.
  • ContainerUtils.java: Crea una clase de utilidad con métodos genéricos estáticos que funcionen con tus contenedores:

    printAll(Container<?> container) - Utiliza un comodín sin límites (unbounded wildcard) para imprimir todos los elementos de cualquier contenedor, uno por línea.

    countItems(Container<? extends Number> container) - Utiliza un comodín con límite superior (upper bounded wildcard) para calcular la suma de todos los valores numéricos en el contenedor, devolviendo el resultado como un double.

    addDefaults(Container<? super Integer> container) - Utiliza un comodín con límite inferior (lower bounded wildcard) para añadir los enteros 1, 2 y 3 a cualquier contenedor que pueda contener enteros.

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - Un método genérico que devuelve el último elemento del contenedor, o el valor por defecto si el contenedor está vacío.

  • Main.java: ¡Une tu sistema de contenedores genéricos! Recibirás tres entradas: una palabra (String), un entero y un double.

    Primero, crea un Container<String> y añade la palabra dos veces. Imprime String container: y luego usa printAll para mostrar su contenido.

    A continuación, crea un Container<Double> y añádele el valor double. Imprime una línea en blanco, luego Number sum: [sum] usando countItems.

    Luego crea un Container<Number> y llama a addDefaults sobre él. Imprime una línea en blanco, luego After adding defaults: y usa printAll para mostrar el contenido.

    Finalmente, crea un Container<Integer> vacío y usa getLastOrDefault con tu entrada entera como valor por defecto. Imprime una línea en blanco, luego Last or default: [result].

Recibirás tres entradas en orden: una palabra (String), un entero y un double.

Este desafío combina clases genéricas, métodos genéricos, parámetros de tipo acotados y los tres tipos de comodines. Observa cómo cada pieza cumple un propósito diferente: la clase genérica proporciona almacenamiento seguro para tipos, los comodines acotados permiten lectura y escritura flexibles, ¡y los métodos genéricos ofrecen operaciones reutilizables en diferentes tipos de contenedores!

Pruébalo tú mismo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leer entradas
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: Crear un Container<String> y añadir la palabra dos veces
        // Imprimir "String container:" luego usar ContainerUtils.printAll()
        
        // TODO: Crear un Container<Double> y añadir el valor double
        // Imprimir una línea en blanco, luego "Number sum: [sum]" usando ContainerUtils.countItems()
        
        // TODO: Crear un Container<Number> y llamar a ContainerUtils.addDefaults() en él
        // Imprimir una línea en blanco, luego "After adding defaults:" y usar ContainerUtils.printAll()
        
        // TODO: Crear un Container<Integer> vacío
        // Usar ContainerUtils.getLastOrDefault() con intValue como valor por defecto
        // Imprimir una línea en blanco, luego "Last or default: [result]"
    }
}

Todas las lecciones de Programación Orientada a Objetos