¿Qué significa <T> (paréntesis angulares) en Java?

139

Actualmente estoy estudiando Java y recientemente he quedado perplejo por los corchetes angulares (<>). Qué significan exactamente?

public class Pool<T>{
    public interface PoolFactory<T>{
        public T createObject();
    }
    this.freeObjects = new ArrayList<T>(maxsize)
}

¿Qué significa <T>eso? ¿Significa que puedo crear un objeto de tipo T?

Risa
fuente
44
Me resulta difícil analizar su código. No hay sangría para empezar, y hay dos llaves abiertas y solo una cerrada. ¿Se T createObjectsupone que está dentro de Pool o PoolFactory? ¿Dónde se this.freeObjects = ...supone que debe estar? ¿Es ese un ejemplo aparte? Es ilegal tenerlo allí; Tiene que estar dentro de un método.
mgiuca
Si alguien está buscando información sobre <>(operador de diamantes) que podría usarse, List<Integer> list = new ArrayList<>();visite docs.oracle.com/javase/7/docs/technotes/guides/language/… .
Pshemo

Respuestas:

161

<T>es un genérico y generalmente se puede leer como "de tipo T". Depende del tipo a la izquierda de <> lo que realmente significa.

No sé qué es Poolo PoolFactoryes, pero también mencionas ArrayList<T>que es una clase estándar de Java, así que hablaré de eso.

Por lo general, no verá "T" allí, verá otro tipo. Entonces, si ve, ArrayList<Integer>por ejemplo, eso significa "Una ArrayListde Integers". Muchas clases usan genéricos para restringir el tipo de elementos en un contenedor, por ejemplo. Otro ejemplo es HashMap<String, Integer>, que significa "un mapa con Stringclaves y Integervalores".

Su ejemplo de Pool es un poco diferente, porque allí está definiendo una clase. Entonces, en ese caso, está creando una clase que otra persona podría instanciar con un tipo particular en lugar de T. Por ejemplo, podría crear un objeto de tipo Pool<String>usando su definición de clase. Eso significaría dos cosas:

  • Mi Pool<String>tendría una interfaz PoolFactory<String>con un createObjectmétodo que devuelve Strings.
  • Internamente, Pool<String>contendría una ArrayListde Strings.

Esta es una gran noticia, porque en otro momento, podría venir y crear uno Pool<Integer>que usaría el mismo código, pero que tenga Integerdonde quiera que vea Ten la fuente.

mgiuca
fuente
3
Una de las mejores explicaciones que he visto hasta ahora :) ¡Muy apreciado !.
Suhas Chikkanna
34

Es muy simple Es una nueva característica introducida en J2SE 5 . Especificar corchetes angulares después del nombre de la clase significa que está creando un tipo de datos temporal que puede contener cualquier tipo de datos.

Ejemplo:

class A<T>{
    T obj;
    void add(T obj){
        this.obj=obj;
    }
    T get(){
        return obj;
    }
}
public class generics {
    static<E> void print(E[] elements){
        for(E element:elements){
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        A<String> obj=new A<String>();
        A<Integer> obj1=new A<Integer>();
        obj.add("hello");
        obj1.add(6);
        System.out.println(obj.get());
        System.out.println(obj1.get());

        Integer[] arr={1,3,5,7};
        print(arr);
    }
}

En lugar de <T>, puedes escribir cualquier cosa y funcionará de la misma manera. Intenta escribir <ABC>en lugar de <T>.

Esto es solo por conveniencia:

  • <T> se conoce como cualquier tipo
  • <E> como tipo de elemento
  • <N> como tipo de número
  • <V> como valor
  • <K> como clave

Pero puedes nombrarlo como quieras, realmente no importa.

Por otra parte, Integer, String, Booleanetc, son clases de contenedor de Java, que ayuda en la comprobación de tipos durante la compilación. Por ejemplo, en el código anterior, objes de tipo String, por lo que no puede agregarle ningún otro tipo (intente obj.add(1), generará un error). Del mismo modo, obj1es del Integertipo, no puede agregarle ningún otro tipo (intente obj1.add("hello"), el error estará allí).

Ruturaj Mohanty
fuente
23

Está relacionado con los genéricos en Java. Si mencioné ArrayList<String>eso significa que solo puedo agregar objetos de tipo String a esa ArrayList.

Los dos principales beneficios de los genéricos en Java son:

  1. Reduciendo el número de lanzamientos en su programa, reduciendo así el número de errores potenciales en su programa.
  2. Mejorando la claridad del código
Paul Bellora
fuente
11

se llama un tipo genérico. Puede crear una instancia de un grupo de objetos como este:

PoolFactory<Integer> pool = new Pool<Integer>();

El parámetro genérico solo puede ser un tipo de referencia. Por lo tanto, no puede usar tipos primitivos como int o double o char u otros tipos primitivos.

Rafiek
fuente
9

<>se usa para indicar genéricos en Java.

Tes un parámetro de tipo en este ejemplo. Y no: crear instancias es una de las pocas cosas que no puedes hacer conT .

Además del tutorial vinculado anteriormente, Angelika Langers Generics FAQ es un gran recurso sobre el tema.

Joachim Sauer
fuente
8

Las clases genéricas son un tipo de clase que toma un tipo de datos como parámetro cuando se crea. Este parámetro de tipo se especifica utilizando corchetes angulares y el tipo puede cambiar cada vez que se instancia una nueva instancia de la clase. Por ejemplo, creemos una ArrayList para los objetos Employee y otra para los objetos Company

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();

Notarás que estamos usando la misma clase ArrayList para crear ambas listas y pasamos el tipo Empleado o Compañía usando corchetes angulares. Tener una clase genérica capaz de manejar múltiples tipos de datos reduce el tener muchas clases que realizan tareas similares. Los genéricos también ayudan a reducir los errores al darle a todo un tipo fuerte que ayuda al compilador a señalar errores. Al especificar un tipo para ArrayList, el compilador arrojará un error si intenta agregar un Empleado a la lista de la Compañía o viceversa.

Adiii
fuente