Duvida List<?>

3 respostas
bestlinux

Pessoa,

Alguém poderia me explicar o sentido de criar um atributo assim:

private List<?> garantias;

E como eu poderia usa-lo ?

Obrigado ! :-o

3 Respostas

Ataxexe

O “?” funciona como um curinga. Ele diz que pode ser qualquer tipo e pode ser usado em conjunto com “extends” ou “super”.

Com extends, será aceito qualquer tipo que herde o informado (<? extends Number> irá aceitar , , etc.).

Com super, será aceito qualquer superclasse ou interface do informado (<? super Method> irá aceitar , , , etc.).

Usar somente o “?” é o mesmo que usar “? extends Object”.

Criar um atributo com o “?” significa dizer que você não sabe ao certo o tipo dos elementos da lista. É quase o mesmo que declarar somente List (quase o mesmo porque há casos de erros de compilação chatos caso use o “?”).

bestlinux

Ataxexe:
O “?” funciona como um curinga. Ele diz que pode ser qualquer tipo e pode ser usado em conjunto com “extends” ou “super”.

Com extends, será aceito qualquer tipo que herde o informado (<? extends Number> irá aceitar , , etc.).

Com super, será aceito qualquer superclasse ou interface do informado (<? super Method> irá aceitar , , , etc.).

Usar somente o “?” é o mesmo que usar “? extends Object”.

Criar um atributo com o “?” significa dizer que você não sabe ao certo o tipo dos elementos da lista. É quase o mesmo que declarar somente List (quase o mesmo porque há casos de erros de compilação chatos caso use o “?”).

Pode colocar um exemplo de uso, por favor.

ViniGodoy

Não há sentido nenhum em criar um atributo assim.

Há sentido em criar métodos que recebam parâmetros desse tipo.

Por exemplo:

public void imprimir(List<?> objetos) { for (Object o : objetos) { System.out.println(o.toString()); } }

Isso aceita como entrada uma List<String> ou uma List<SuaClasse>. O ? indica que tanto faz o tipo da lista. Você ainda poderia restringir. Por exemplo:

public static void ordena(List<? extends Carro> lista, Comparator<? super Carro> comparador) { Collections.sort(lista, comparador); }

Esse método aceita qualquer um List<Carro> ou um List de um tipo filho de carro, como um List<Fusca> no primeiro parâmetro. E no segundo, aceita um comparador de Carro ou de qualquer classe que seja pai de carro, como Comparator<<Veiculo>>.

Criado 9 de agosto de 2010
Ultima resposta 9 de ago. de 2010
Respostas 3
Participantes 3