Atualmente, estou estudando Java e recentemente fui atingido por colchetes angulares (<>). O que exatamente eles significam?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<T>(maxsize)
}
O que <T>
significa isso? Isso significa que eu posso criar um objeto do tipo T
?
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.<>
(operador de diamante) que possam ser usadas,List<Integer> list = new ArrayList<>();
visite docs.oracle.com/javase/7/docs/technotes/guides/language/… .Respostas:
<T>
é um genérico e geralmente pode ser lido como "do tipo T". Depende do tipo à esquerda do <> o que realmente significa.Não sei o que é
Pool
ouPoolFactory
é, mas você também mencionouArrayList<T>
, que é uma classe Java padrão, então vou falar com isso.Normalmente, você não verá "T", verá outro tipo. Então, se você vir,
ArrayList<Integer>
por exemplo, isso significa "AnArrayList
ofInteger
s". Muitas classes usam genéricos para restringir o tipo dos elementos em um contêiner, por exemplo. Outro exemplo é oHashMap<String, Integer>
que significa "um mapa comString
chaves eInteger
valores".Seu exemplo de pool é um pouco diferente, porque você está definindo uma classe. Portanto, nesse caso, você está criando uma classe que alguém poderia instanciar com um tipo específico no lugar de T. Por exemplo, eu poderia criar um objeto do tipo
Pool<String>
usando sua definição de classe. Isso significaria duas coisas:Pool<String>
teria uma interfacePoolFactory<String>
com umcreateObject
método que retornaString
s.Pool<String>
conteria umArrayList
de Strings.Esta é uma ótima notícia, porque em outro momento, eu poderia criar um
Pool<Integer>
que usaria o mesmo código, mas teriaInteger
onde você vêT
na fonte.fonte
É 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:
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 chaveMas 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 tipoString
, portanto você não pode adicionar nenhum outro tipo a ele (tenteobj.add(1)
, isso gera um erro). Da mesma forma,obj1
é doInteger
tipo, você não pode adicionar nenhum outro tipo (tenteobj1.add("hello")
, o erro estará lá).fonte
Está relacionado aos genéricos em java. Se mencionei
ArrayList<String>
isso significa que posso adicionar apenas o objeto do tipo String a esse ArrayList.Os dois principais benefícios dos genéricos em Java são:
fonte
é chamado de tipo genérico. Você pode instanciar um pool de objetos como este:
O parâmetro genérico pode ser apenas um tipo de referência. Portanto, você não pode usar tipos primitivos como int ou double ou char ou outros tipos primitivos.
fonte
<>
é usado para indicar genéricos em Java.T
é um parâmetro de tipo neste exemplo. E não: instanciar é uma das poucas coisas com as quais você não pode fazerT
.Além do tutorial vinculado acima, a FAQ sobre Genéricos da Angelika Langers é um ótimo recurso sobre o assunto.
fonte
Classes genéricas são um tipo de classe que recebe um tipo de dados como parâmetro quando ele é criado. Esse parâmetro de tipo é especificado usando colchetes angulares e o tipo pode mudar sempre que uma nova instância da classe é instanciada. Por exemplo, vamos criar um ArrayList para objetos Employee e outro para objetos Company
Você notará que estamos usando a mesma classe ArrayList para criar as duas listas e passamos no tipo Employee ou Company usando colchetes angulares. Ter uma classe genérica capaz de lidar com vários tipos de dados reduz a quantidade de classes que executam tarefas semelhantes. Os genéricos também ajudam a reduzir os bugs, fornecendo a tudo um tipo forte que ajuda o compilador a apontar erros. Ao especificar um tipo para ArrayList, o compilador gerará um erro se você tentar adicionar um Funcionário à lista da Empresa ou vice-versa.
fonte