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
?
T createObject
supone que está dentro de Pool o PoolFactory? ¿Dónde sethis.freeObjects = ...
supone que debe estar? ¿Es ese un ejemplo aparte? Es ilegal tenerlo allí; Tiene que estar dentro de un método.<>
(operador de diamantes) que podría usarse,List<Integer> list = new ArrayList<>();
visite docs.oracle.com/javase/7/docs/technotes/guides/language/… .Respuestas:
<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
oPoolFactory
es, pero también mencionasArrayList<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 "UnaArrayList
deInteger
s". Muchas clases usan genéricos para restringir el tipo de elementos en un contenedor, por ejemplo. Otro ejemplo esHashMap<String, Integer>
, que significa "un mapa conString
claves yInteger
valores".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:Pool<String>
tendría una interfazPoolFactory<String>
con uncreateObject
método que devuelveString
s.Pool<String>
contendría unaArrayList
de 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 tengaInteger
donde quiera que veaT
en la fuente.fuente
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:
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 clavePero puedes nombrarlo como quieras, realmente no importa.
Por otra parte,
Integer
,String
,Boolean
etc, 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,obj
es de tipoString
, por lo que no puede agregarle ningún otro tipo (intenteobj.add(1)
, generará un error). Del mismo modo,obj1
es delInteger
tipo, no puede agregarle ningún otro tipo (intenteobj1.add("hello")
, el error estará allí).fuente
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:
fuente
se llama un tipo genérico. Puede crear una instancia de un grupo de objetos como este:
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.
fuente
<>
se usa para indicar genéricos en Java.T
es 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.
fuente
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
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.
fuente