import java.util.List;

/** Type erasure y la diferencia con los arreglos. */
public class ErasureDemo {
    public static void main(String[] args) {
        // En ejecución, Box<String> y Box<Integer> son la misma clase.
        Box<String> a = new Box<>();
        Box<Integer> b = new Box<>();
        System.out.println(a.getClass() + " == " + b.getClass() + ": "
                + (a.getClass() == b.getClass()));

        // Los arreglos sí recuerdan su tipo y son covariantes:
        // un Integer[] se puede ver como Number[], y el error aparece en ejecución.
        Integer[] ints = {1, 2, 3};
        Number[] nums = ints;               // compila
        try {
            nums[0] = 2.5;                  // un Double en un arreglo de Integer
        } catch (ArrayStoreException e) {
            System.out.println("ArrayStoreException: " + e.getMessage());
        }

        // Con listas el compilador no deja llegar hasta ahí (ver errores/Invariance.java).
        List<Integer> list = List.of(1, 2, 3);
        System.out.println("list: " + list);
    }
}
