2011-07-07 25 views
88

Actualmente estoy estudiando Java y recientemente me han sorprendido los corchetes angulares (<>). Qué significan exactamente?¿Qué significa <T> (corchetes angulares) en Java?

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

¿Qué significa la <T>? ¿Significa que puedo crear un objeto del tipo T?

+8

google java generics –

+4

Me resulta difícil analizar su código. No hay sangría para empezar, y hay dos llaves abiertas y solo una cerrada. ¿Se supone que 'T createObject' está dentro de Pool o PoolFactory? ¿Dónde se supone que 'this.freeObjects = ...' es?Es ese un ejemplo separado? Es ilegal tenerlo allí; tiene que estar dentro de un método. – mgiuca

+0

Si alguien está buscando información sobre '<>' (operador de diamante) que podría usarse como 'List list = new ArrayList <>();' visite https://docs.oracle.com/javase/7/docs /technotes/guides/language/type-inference-generic-instance-creation.html. – Pshemo

Respuesta

4

<> se utiliza 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 puede hacer con T.

Aparte de la guía de aprendizaje vinculado anteriormente Angelika Langers Generics FAQ es un gran recurso sobre el tema.

6

se denomina tipo genérico. Usted puede crear una instancia de una agrupación de objetos de esta manera:

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

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

101

<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<T>, que es una clase Java estándar, así que hablaré con eso.

Por lo general, usted no verá en "T" de allí, verá otro tipo. Entonces, si ve ArrayList<Integer> por ejemplo, eso significa "Un ArrayList de Integer s". 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 claves String y valores Integer".

Su ejemplo de agrupación es un poco diferente, porque allí está que define 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 método que devuelve createObjectString s.
  • Internamente, el Pool<String> contendría un ArrayList de cadenas.

Esta es una gran noticia, porque en otro momento, podría venir y crear un Pool<Integer> que pueden utilizar el mismo código, pero tienen Integer donde vea T en la fuente.

16

Se relaciona con los genéricos en Java. Si mencioné ArrayList<String> eso significa que puedo agregar solo el tipo de objeto String a esa ArrayList.

Las dos principales ventajas de los genéricos en Java son:

  1. reducción del número de moldes en su programa, lo que reduce el número de errores potenciales en su programa.
  2. Mejorar la claridad del código
1

clases genéricas son un tipo de clase que toma un tipo de datos como un 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, vamos a crear un ArrayList de objetos a los empleados de la empresa y otro para objetos

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

Se dará cuenta de que estamos usando la misma clase ArrayList para crear ambas listas y que pasa en el empleado o la compañía Tipo usando ángulo soportes. Tener una clase genérica capaz de manejar múltiples tipos de datos reduce la cantidad de clases que realizan tareas similares. Los genéricos también ayudan a reducir los errores al proporcionar un tipo fuerte que ayuda al compilador a detectar errores. Al especificar un tipo para ArrayList, el compilador emitirá un error si intenta agregar un empleado a la lista de la empresa o viceversa.

10

Es realmente 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 temporales 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>, en realidad se puede escribir cualquier cosa y que funcionará de la misma manera. Intente escribir <ABC> en lugar de <T>.

Esto es sólo 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 ponerle el nombre que quieras, en realidad no importa.

Además, Integer, String, Boolean etc. son clases de envoltorio de Java que ayudan a verificar los tipos durante la compilación. Por ejemplo, en el código anterior, obj es del 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í).

Cuestiones relacionadas