importjava.util.*;classTest14{public<T>List<?>meth(List<T>type){System.out.println(type);// 1returnnewArrayList<String>();// 2}}/*A - Will not compile at Line 1 and Line 2B - Will compileC - Has runtime errosD - Will not compile at Line 2E - Will not compile at Line 1The correct answer is B.A List<?> is expected so it can be any Object.*/
Este compila normalmente.
importjava.util.*;classTest32{public<T>List<T>meth(List<?>type){System.out.println(type);// 1returnnewArrayList<String>();// 2}}/*A - Will not compile at Line 1 and 2B - Will not compile at Line 2C - Has runtime erros.D - Will not compile at Line 1E - Will compileThis 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
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
returnnewArrayList<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!
<?> // 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?