Algunas restricciones de Genéricos Java

Avanzado

Hay algunas restricciones que debe tener en cuenta al usar genéricos.

Implican la creación de objetos de un parámetro de tipo, miembros estáticos, excepciones y matrices. Cada uno se examina aquí.

1. Los parámetros de tipo no pueden ser instanciados

No es posible crear una instancia de un parámetro de tipo. Por ejemplo, considere esta clase:

//No se puede crear una instancia de T
   class Gen<T>{
       T ob;
       Gen(){
           ob= new T(); //Ilegal;
       }
   }

Aquí, es ilegal intentar crear una instancia de T. La razón debería ser fácil de entender: el compilador no tiene forma de saber qué tipo de objeto crear. T es simplemente un marcador de posición.

2. Restricciones en miembros estáticos

Ningún miembro estático puede usar un parámetro de tipo declarado por la clase envolvente. Por ejemplo, ambos miembros estáticos de esta clase son ilegales:

class Incorrecto<T>{
       //Incorrecto, no hay variables estáticas de tipo T.
       static T ob;
       //Incorrecto, no hay métodos estáticos de tipo T.
       static T getOb(){
           return ob;
       }
   }

Aunque no puede declarar miembros estáticos que usan un parámetro de tipo declarado por la clase adjunta, puede declarar métodos genéricos estáticos, que definen sus propios parámetros de tipo, como se hizo anteriormente.

3. Restricciones de arrays genéricos

Hay dos restricciones genéricas importantes que se aplican a los arrays. Primero, no puede instanciar una array cuyo tipo de elemento es un parámetro de tipo. En segundo lugar, no puede crear un array de referencias genéricas específicas de tipo. El siguiente programa corto muestra ambas situaciones:

//Genéricos y Arrays

class Gen <T extends Number>{
    T ob;
    T vals[]; //Ok

    Gen(T o,T[] nums){
        ob=o;

        //Esta declaración es ilegal
       // vals=new T[10]; //No se puede crear un array de T

        //Esta declaración es Ok
        vals=nums; //OK para asignar referencia al array existente
    }
}

class GenArrays {
    public static void main(String[] args) {
        Integer n[]= {1,2,3,4,5};
        Gen<Integer> iOb=new Gen<Integer>(50,n);

        //no puede crear un array o referencias genéricas específicas de tipo
        //Gen<Integer> gens[]=new Gen<Integer>[10]; //Error

        //Esto sí está Ok
        Gen<?> gens[]=new Gen<?>[10]; //Ok
    }
}

Como muestra el programa, es válido declarar una referencia a un array de tipo T, como lo hace esta línea:

T vals[]; // OK

Pero, no se puede instanciar un array de T, como lo intenta esta línea comentada:

// vals = new T[10];

La razón por la que no puede crear una matriz de T es que no hay forma de que el compilador sepa qué tipo de matriz crear realmente. Sin embargo, puede pasar una referencia a un array compatible con el tipo a Gen() cuando se crea un objeto y asignar esa referencia a vals, como hace el programa en esta línea:

vals = nums; // OK

Esto funciona porque la matriz pasada a Gen() tiene un tipo conocido, que será del mismo tipo que T en el momento de la creación del objeto. Dentro de main(), observe que no puede declarar una matriz de referencias a un tipo genérico específico. Es decir, esta línea

// Gen<Integer> gens[] = new Gen<Integer>[10]; //Error!

no compilará

4. Restricción de excepción genérica

Una clase genérica no puede extender Throwable. Esto significa que no puede crear clases de excepciones genéricas.

Genéricos en Java
  • Restricciones de Genéricos

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.