O que <T> (colchetes angulares) significa em Java?

139

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?

Risada
fonte
4
Estou achando difícil analisar seu código. Não há recuo para começar, e existem dois chavetas abertas e apenas uma fechada. É T createObjectsuposto estar dentro de Pool ou PoolFactory? Onde this.freeObjects = ...deveria estar? Esse é um exemplo separado? É ilegal tê-lo lá; tem que estar dentro de um método.
mgiuca
Se alguém estiver procurando informações sobre <>(operador de diamante) que possam ser usadas, List<Integer> list = new ArrayList<>();visite docs.oracle.com/javase/7/docs/technotes/guides/language/… .
Pshemo

Respostas:

161

<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 é Poolou PoolFactoryé, mas você também mencionou ArrayList<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 "An ArrayListof Integers". Muitas classes usam genéricos para restringir o tipo dos elementos em um contêiner, por exemplo. Outro exemplo é o HashMap<String, Integer>que significa "um mapa com Stringchaves e Integervalores".

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:

  • Meu Pool<String>teria uma interface PoolFactory<String>com um createObjectmétodo que retorna Strings.
  • Internamente, o Pool<String>conteria um ArrayListde Strings.

Esta é uma ótima notícia, porque em outro momento, eu poderia criar um Pool<Integer>que usaria o mesmo código, mas teria Integeronde você vê Tna fonte.

mgiuca
fonte
3
Uma das melhores explicações que já vi até agora :) Muito apreciada !.
Suhas Chikkanna
34

É 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á).

Ruturaj Mohanty
fonte
23

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:

  1. Reduzindo o número de transmissões no seu programa, reduzindo assim o número de possíveis bugs no seu programa.
  2. Melhorando a clareza do código
Paul Bellora
fonte
11

é chamado de tipo genérico. Você pode instanciar um pool de objetos como este:

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

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.

Rafiek
fonte
9

<>é 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 fazer T.

Além do tutorial vinculado acima, a FAQ sobre Genéricos da Angelika Langers é um ótimo recurso sobre o assunto.

Joachim Sauer
fonte
8

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

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<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.

Adiii
fonte