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

Actualmente estoy estudiando Java y recientemente me han dejado de lado los paréntesis angulares (). Qué significan exactamente?

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

¿Qué significa la ? ¿Significa que puedo crear un objeto de tipo 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 Pool o PoolFactory , pero también mencionas ArrayList , que es una clase estándar de Java, así que hablaré sobre eso.

Por lo general, no verá “T” allí, verá otro tipo. Entonces, si ve ArrayList por ejemplo, eso significa “An ArrayList of Integer s”. Muchas clases usan generics para restringir el tipo de elementos en un contenedor, por ejemplo. Otro ejemplo es HashMap , que significa “un mapa con claves de String y valores Integer “.

El ejemplo de su 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 utilizando su definición de clase. Eso significaría dos cosas:

  • Mi Pool tendría una interfaz PoolFactory con un método createObject que devuelve String s.
  • Internamente, Pool contendría una ArrayList de cadenas.

Esta es una gran noticia, porque en otro momento, podría venir y crear un Pool que usaría el mismo código, pero tendría Integer siempre que vea T en la fuente.

Está relacionado con los generics en Java. Si mencioné ArrayList eso significa que puedo agregar solo el tipo de objeto String a esa ArrayList.

Los dos principales beneficios de los generics en Java son:

  1. Reducir el número de lanzamientos en su progtwig, reduciendo así la cantidad de posibles errores en su progtwig.
  2. Mejorando la claridad del código

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

Ejemplo:

 class A{ T obj; void add(T obj){ this.obj=obj; } T get(){ return obj; } } public class generics { static void print(E[] elements){ for(E element:elements){ System.out.println(element); } } public static void main(String[] args) { A obj=new A(); A obj1=new A(); 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 , puedes escribir cualquier cosa y funcionará de la misma manera. Intenta escribir en lugar de .

Esto es solo por conveniencia:

  • se conoce como cualquier tipo
  • como tipo de elemento
  • como tipo de número
  • como valor
  • como clave

Pero puedes ponerle el nombre que quieras, en realidad no importa.

Además, Integer , String , Boolean , etc. son clases contenedoras de Java que ayudan a verificar los tipos durante la comstackción. Por ejemplo, en el código anterior, obj es de tipo String , por lo que no puede agregar ningún otro tipo (intente obj.add(1) , emitirá un error). Del mismo modo, obj1 es del tipo Integer , no puede agregar ningún otro tipo (intente obj1.add("hello") , el error estará allí).

se llama tipo genérico Puede crear una instancia de un objeto Pool así:

 PoolFactory pool = new Pool(); 

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.

<> se usa para indicar generics en Java.

T es un parámetro de tipo en este ejemplo. Y no: instanciar es una de las pocas cosas que no puedes hacer con T

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

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 crea una instancia de una nueva instancia de la clase. Por ejemplo, creemos una ArrayList para objetos Employee y otra para objetos Company

 ArrayList employees = new ArrayList(); ArrayList companies = new ArrayList(); 

Notará que estamos utilizando 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 la cantidad de clases que realizan tareas similares. Los generics también ayudan a reducir los errores al proporcionar un tipo fuerte que ayuda al comstackdor a detectar errores. Al especificar un tipo para ArrayList, el comstackdor emitirá un error si intenta agregar un empleado a la lista de la empresa o viceversa.