É 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, Booleanetc, 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 Integertipo, você não pode adicionar nenhum outro tipo (tente obj1.add("hello"), o erro estará lá).
T createObjectsuposto 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.