Java: comprender la naturaleza de los genéricos de la colección a través de la reflexión

Los genéricos de las colecciones en Java son para evitar entradas erróneas, y solo son válidos durante la fase de compilación, y omitir la compilación en el tiempo de ejecución no es válido.

Vamos a verificar con un ejemplo

/ ** 
 * La esencia de los genéricos de la colección 
 * @description 
 * @author Trigl 
 * @date 2 de abril de 2016 2:54:11 am 
 * / 
public  class GenericEssence {
     public  static  void main (String [] args) { 
        List list1 = new ArrayList (); // Sin 
        lista genérica <String> list2 = new ArrayList <String> (); // Hay genérico 


        / * 
         * 1. Primero observe la forma normal de agregar elementos, verifique los genéricos en el compilador, 
         * En este momento, si se agrega el tipo int a list2, se informará un error 
         * / 
        list2.add ( "hello" );
 //       list2.add (20); //¡Informar un error! List2 tiene una restricción genérica, solo puede agregar String, agregar int error 
        System.out.println ("La longitud de list2 es:" + list2.size ()); // La longitud de list2 es 1 


        / * 
         * 2. Luego pase Reflexione para agregar elementos, cargue dinámicamente la clase en tiempo de ejecución, primero obtenga el 
         mismo tipo de tipo de list1 y list2 *, y luego omita el compilador mediante la reflexión del método para llamar al método add para ver si puede insertar 
         elementos de tipo int * 
         * / 
        Class c1 = list1.getClass (); 
        Clase c2 = list2.getClass (); 
        System.out.println (c1 == c2); // Resultado: verdadero, que indica que el tipo de la clase es exactamente el mismo 

        // verificación: Podemos usar la reflexión del método para Agregue elementos a list2, para que pueda omitir la verificación de compilación 
        intente { 
            Método m = c2.getMethod ("add", Object. Class ); // Agregue el método a través de la reflexión del método
            m.invoke (list2, 20); // Agregue un tipo int a list2. Lo anterior muestra que el compilador informará un error 
            System.out.println ("La longitud de list2 es:" + list2.size ()); / / Resultado: 2, que indica que la longitud de list2 ha aumentado y no hay verificación genérica 
        } catch (Excepción e) { 
            e.printStackTrace (); 
        } 

        / * 
         * En resumen, podemos ver que en el compilador, los genéricos limitarán la colección Los tipos de elementos internos siguen siendo los mismos, pero una vez que el compilador termina de ingresar el 
         tiempo de ejecución *, los genéricos ya no funcionarán, incluso se pueden insertar elementos de diferentes tipos en la colección. 
         * / 
    } 
}

 

Supongo que te gusta

Origin www.cnblogs.com/xingchong/p/12723950.html
Recomendado
Clasificación