Estou estudando Head First Java, mas eu não consigo entender Página 544

votos
0

Quando você declarar um parâmetro de tipo para a classe, você pode simplesmente usar esse tipo qualquer lugar que você usaria uma classe real ou tipo de interface. O tipo declarado no argumento método é essencialmente substituída por um tipo que você usa quando você instanciar o classe.

Se a classe em si não usa um parâmetro de tipo, você ainda pode especificar um para um método, declarando-o em um realmente incomum (mas disponível) espaço antes do tipo de retorno, este método diz que T pode ser qualquer tipo de Animal.

Você pode explicar?

Publicado 27/08/2009 em 01:24
fonte usuário
Em outras línguas...                            


3 respostas

votos
7

O que isto significa é que, em uma classe genérica, você pode escrever métodos como assim:

public T doSomething () {
}

Note-se que o tipo de retorno é 'T'.

Em tempo de compilação, o tipo de retorno desse método será o que você passou para a classe genérica quando instanciado-lo.

Respondeu 27/08/2009 em 01:28
fonte usuário

votos
1

Para o primeiro parágrafo, este é o quão genéricos trabalhar para classes. Por exemplo, para uma lista, você pode criar uma lista de um tipo genérico, como número inteiro, por exemplo:

ArrayList<Integer> list = new ArrayList<Integer>();

(em código real, você usaria List<Integer>é claro)

Agora ArrayList será definido como:

public class Arraylist<T> { // implements....

    // ...

    public T get(int index) {
         // ...
    }
}

Que é o que torna possível usar o getmétodo on liste obter uma Integer(porque fizemos uma classe de tipo ArrayList<Integer>assim T = Integer). Caso contrário, o compilador não teria nenhuma idéia que tipos de objetos a lista foi armazenar e você teria que obter o método para retornar um Object, que é como ele costumava ser.

O segundo parágrafo significa é que você pode adicionar parâmetros de tipo de métodos, assim como você pode para classes. por exemplo:

public <T> void noOp(T element) {
    // code here
}

Isso permitirá que você, por exemplo, para criar um método utilitário estático que retorna algo do tipo T. Para retornar o primeiro elemento de uma lista de T de:

public static <T> T getFirst (List<T> list) {
    return list.get(0);
}

E você pode usar este método de modo fortemente tipado. Sugestões para melhores exemplos bem-vindos. :-)

edit: Eu só percebi depois que eu escrevi algo que usa essa funcionalidade. Eu estava usando a API JPA e ficando muito irritado com todas as vezes você tem que devolver algo (uma lista, ou um único item) a partir de uma consulta, e correndo para avisos do tipo desmarcada porque não há nenhuma maneira de inferir o tipo aqui. Se você é como eu e tentando evitar advertências no seu código, você teria que suprimir as advertências cada vez. Então eu escrevi este método para suprimir os avisos para mim:

@SuppressWarnings("unchecked")
public static <T> List<T> returnResultList(Query query) {
    return (List<T>)query.getResultList();
}

Que através da magia da inferência de tipos trabalham em:

List<Integer> list = returnResultList(query);
Respondeu 27/08/2009 em 13:02
fonte usuário

votos
1
class Zoo<T> {
   static void putAnimal(T animal) {
       // do stuff
   }
}

Zoo<Ape> apeZoo = new Zoo<Ape>(); // you can now put apes (and chimps) here
Zoo<Reptile> monkeyZoo = new Zoo<Reptile>(); // this zoo takes reptiles

apeZoo.putAnimal(new Chimp());
monkeyZoo.putAnimal(new Tortoise());
Respondeu 27/08/2009 em 02:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more