Dúvida Generics

9 respostas
diegobrandao

Boa tarde a todos,

Tenho o seguinte código:

import java.util.*;
class Test14 {
	public <T> List<?> meth(List<T> type)
	{
	   System.out.println(type); // 1
	   return new ArrayList<String>(); // 2
	}
}
/*
A - Will not compile at Line 1 and Line 2
B - Will compile
C - Has runtime erros
D - Will not compile at Line 2
E - Will not compile at Line 1

The correct answer is B.
A List<?> is expected so it can be any Object.
*/

Este compila normalmente.

import java.util.*;
class Test32{
	public <T> List<T> meth(List<?> type)
	{
	   System.out.println(type); // 1
   	   return new ArrayList<String>(); // 2
	}
}
/*
A - Will not compile at Line 1 and 2
B - Will not compile at Line 2
C - Has runtime erros.
D - Will not compile at Line 1
E - Will compile

This code...
The correct answer is B.
Does not compile at 2. List  is required.
*/

Já este que é BEM parecido não compila.
Não consegui enteder o porque…
Ao compilar vi que ele requer um java.util.List

Se alguém poder ajudar agradeço…

9 Respostas

ralphsilver

o parametro <?> significa que vc está criando uma classe generica do tipo que ele for instanciado… então, não tem como entregar uma list desse jeito… vc pode receber mas não enviar…

ricardo13

olá,

Você pegou essa questão do Inquisistion ???

Falou e t+

Ricardo

victorwss

Embora o método do segundo exemplo não faça lá muito sentido, não consigo ver porque não compilaria.
Vou testar com o compilador.

EDIT: Ah tá. Não compila porque T não é String. No primeiro exemplo como o retorno é List<?> o compilador está se lixando para o <String>, já no segundo exemplo não.

diegobrandao

Olá

Peguei sim… Estou achando ele muito difícil…

Obrigatoriamente eu preciso retornar

return new ArrayList<T>(); // 2

Quando mistura os dois: T e ? fica complicado… Devo esperar este tipo de questão no exame?

gilmaslima

diegobrandao:
Olá

Quando mistura os dois: T e ? fica complicado… Devo esperar este tipo de questão no exame?

Sim, pode esperar que vai cair com certeza no exame!

vê se isso lhe ajuda:

<?> // pode ser tudo que herde de Object alem de Object
<T> // Somente T 
<? super Animal> // somente Animal ou uma superclasse
<? extends Animal> // qualquer subclasse de Animal inclusive Animal
rodrigo.ferreira

Mais uma dica pra complementar a dica do colega:

<?> // pode ser tudo que herde de Object alem de Object

(Qualquer tentativa de adicionar algo ao conjunto causará erro de compilação)

// Somente T
(Pode adicionar algo ao conjunto)

<? super Animal> // somente Animal ou uma superclasse (Pode adicionar algo ao conjunto) <? extends Animal> // qualquer subclasse de Animal inclusive Animal (Qualquer tentativa de adicionar algo ao conjunto causará erro de compilação) Resumindo: Você conseguirá compilar nos casos do coringa(?) e de (? extends) SE, E SOMENTE SE, NÃO FOR ADICIONADO AO CONJUNTO. Nos outros casos pode, por que será o próprio tipo ou algo superior a ele. Genérics tem "milhares" de regrinhas... tem que praticar bastante ;-) Abraço.
gilmaslima

Concordo na prova eu me dei mal, não passei por duas questões, se eu estivesse melhor na parte de generics teria passado, mas já estou estudando pra fazer a prova de novo.

abraços!

dlt

No primeiro exemplo compila porque o tipo de retorno esperado pra esse método é uma lista de qualquer tipo.

Agora, não ficou muito claro pra mim porque ele consegue criar um novo ArrayList mas não consegue um array T[]:

public <T> List<T> meth(List<?> type) { System.out.println(type); T[] ta = new T[10]; //NÃO COMPILA return new ArrayList<T>(); // COMPILA }

Se o tipo é apagado em runtime, porque é possível criar a lista e não o array?

ricardo13

olá,

eu to apanhando bastante com o Inquisition tb.

to conseguindo 50%. axo q preciso estudar mais

Muito Obrigado

Ricardo

Criado 20 de outubro de 2008
Ultima resposta 21 de out. de 2008
Respostas 9
Participantes 7