É realmente simples. É um novo recurso introduzido no J2SE 5 . Especificar colchetes angulares após o nome da classe significa que você está criando um tipo de dados temporário que pode conter qualquer tipo de dados.
Exemplo:
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);
}
}
Em vez de <T>
, você pode realmente escrever qualquer coisa e funcionará da mesma maneira. Tente escrever <ABC>
no lugar de <T>
.
Isso é apenas por conveniência:
<T>
é referido como qualquer tipo
<E>
como tipo de elemento
<N>
como tipo de número
<V>
como valor
<K>
como chave
Mas você pode dar o nome que quiser, isso realmente não importa.
Além disso, Integer
, String
, Boolean
etc, são classes de mensagens publicitárias de Java que ajuda na verificação de tipos durante a compilação. Por exemplo, no código acima, obj
é do tipo String
, portanto você não pode adicionar nenhum outro tipo a ele (tente obj.add(1)
, isso gera um erro). Da mesma forma, obj1
é do Integer
tipo, você não pode adicionar nenhum outro tipo (tente obj1.add("hello")
, o erro estará lá).
T createObject
suposto estar dentro de Pool ou PoolFactory? Ondethis.freeObjects = ...
deveria estar? Esse é um exemplo separado? É ilegal tê-lo lá; tem que estar dentro de um método.