Dúvida questão Testkiller - Generics

6 respostas
Java_Player

Não entendi essa questão:

Question 179

Given:

class A {}

class B extends A {}

class C extends A {}

class D extends B {}

Which three statements are true? (Choose three.)

A. The type List<a> is assignable to List.

B. The type List<b> is assignable to List<a>.

C. The type List is assignable to List<?>.

D. The type List is assignable to List<? extends B>.

E. The type List<? extends A> is assignable to List</a><a>.

F. The type List is assignable to any List reference.

G. The type List<? extends B> is assignable to List<? extends A>.

Answer: CDG</a></b></a>

Por que a opção A está incorreta??

6 Respostas

J

A referência sem parâmetros de um tipo parametrizado é equivalente a colocar Object como
parâmetro. Assim:

List lista;

e

List lista;

são equivalentes. Uma List não pode receber uma referência para List, por exemplo.
Para poder aceitar o parâmetro como sendo qqer subclasse de Object, precisa usar coringa:

List<? extends Object> lista = new List();

ou, melhor, o equivalente

List<?> lista = new List();

Espero ter esclarecido,

Jorge

Java_Player

Jorge Diz:
A referência sem parâmetros de um tipo parametrizado é equivalente a colocar Object como
parâmetro. Assim:

List lista;

e

List lista;

são equivalentes. Uma List não pode receber uma referência para List, por exemplo.
Para poder aceitar o parâmetro como sendo qqer subclasse de Object, precisa usar coringa:

List<? extends Object> lista = new List();

ou, melhor, o equivalente

List<?> lista = new List();

Espero ter esclarecido,

Jorge

Faz sentido o que você disse, mas que eu saiba, uma List (não genérica), aceita qualquer Lista genérica.

List lista = new ArrayList();
List<String> lista2 = new ArrayList<String>();
lista = lista2;

Testei o código acima e compilou normalmente…

Francisco_Barroso
<blockquote><div class="quote-author">Jorge Diz:</div>

…

List<? extends Object> lista = new List();

ou, melhor, o equivalente

List<?> lista = new List();

…

Jorge</blockquote>

Isso não é permitido, o tipo da declaração da variável precisa bater com o tipo que você passa ao tipo real do objeto.
List lista = new ArrayList();
Qualquer coisa que você atribuir à referência lista deve ser do tipo genérico

Java Player realmente uma List (não genérica), aceita qualquer Lista…o gabarito deve estar errado.

victorwss
<blockquote><div class="quote-author">Francisco Barroso:</div><blockquote><div class="quote-author">Jorge Diz:</div>

…

List<? extends Object> lista = new List();

ou, melhor, o equivalente

List<?> lista = new List();

…

Jorge</blockquote>

Isso não é permitido, o tipo da declaração da variável precisa bater com o tipo que você passa ao tipo real do objeto.
List lista = new ArrayList();
Qualquer coisa que você atribuir à referência lista deve ser do tipo genérico

Java Player realmente uma List (não genérica), aceita qualquer Lista…o gabarito deve estar errado.

Falou besteira. List<? extends Object> e List<?> são sinônimos. String extends Object, logo tá certo. O erro está no fato de instanciar uma interface (new List()). Mas em relação aos generics está certo.

Essa questão caiu na minha prova!

Java_Player
<blockquote><div class="quote-author">victorwss:</div><blockquote><div class="quote-author">Francisco Barroso:</div><blockquote><div class="quote-author">Jorge Diz:</div>

…

List<? extends Object> lista = new List();

ou, melhor, o equivalente

List<?> lista = new List();

…

Jorge</blockquote>

Isso não é permitido, o tipo da declaração da variável precisa bater com o tipo que você passa ao tipo real do objeto.
List lista = new ArrayList();
Qualquer coisa que você atribuir à referência lista deve ser do tipo genérico

Java Player realmente uma List (não genérica), aceita qualquer Lista…o gabarito deve estar errado.

Falou besteira. List<? extends Object> e List<?> são sinônimos. String extends Object, logo tá certo. O erro está no fato de instanciar uma interface (new List()). Mas em relação aos generics está certo.

Essa questão caiu na minha prova!

Mas então pq a opção A está incorreta? Continuo não entendendo.

Raff

a resposta A está correta sim o testKiller que está errado !

Criado 22 de maio de 2008
Ultima resposta 26 de mai. de 2008
Respostas 6
Participantes 5