Generics - dúvida de uma questão do livro

7 respostas
A

Ei gente… eu estou muito confusa em relação a generics e tem uma questão do livro que não desce… pág 356, questão 14 (kathy, 2 ed).

public static void main (String [] args){

String[] array = {123, 1, 2};

List<String> list = Arrays.asList(array);

Collection<String> resultList = getLongWords(list);

}
// INSIRA A DECLACAO AQUI

{

Collection<E> longWords = new ArrayList<E>();

// faz umas coisinhas com a lista

return longWords;

}

o que eu não entendi direito foi a explicação do porque a letra G esta errada.

G. static public <E super CharSequence> Collection<E> getLongWords(Collection<E> coll)

Para mim não poderia ser porque String não é uma superclasse de CharSequence. Mas o livro justifica falando que a resposta não faz sentido porque <E super CharSequence> deveria usar um coringa e não uma variável de tipo como E. Porque??

Obrigada!! Mesmo!

7 Respostas

P

Esta questão é igual a minha duvida:
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=43163
o super não pode ser usado junto com E.

P

Esta questão é igual a minha duvida:
http://www.portaljava.com/home/modules.php?name=Forums&file=viewtopic&t=43163
o super não pode ser usado junto com E.

A

Eu vi que não pode, nem compilar o trem compila. Mas minha pergunta é: porque não pode?? Porque do jeito que eu entendo (que visivelmente esta errado de alguma forma) <T super Classe> quer dizer que T tem que ser uma superclasse de Classe, assim como <T extends Classe> quer dizer que Classe tem que ser uma subclasse de Classe. Então porque <T extends Classe> é válido e <T super Classe> não?

L

Bem, para o dia a dia o importante é saber que não funciona. E para a evolução é bom saber porque não pode. E eu te digo que desde que você postou tenho perdido um tempinho tentando chegar a conclusão hehe
Ainda não consegui chegar a uma conclusão que seja lógica e correta e que eu consiga te explicar aqui. Mas achei um post no forum do java com a mesma pergunta

http://forum.java.sun.com/thread.jspa?threadID=5128305&messageID=9457988

E la eles dão outro link que te encaminha para a definição da linguagem (mais precisamente para o item 4.4) e ai o negócio começa a ficar difícil de entender e hoje realmente não estou inspirado para isso hehe :razz:

mas já é um ponto de partida eheh

L

Ah, só para constar, a coisa mais legal que achei la foi a possibilidade de fazer métodos assim:

&lt;T extends Serializable &amp; Comparable&lt;T&gt; &amp; Cloneable&gt; void method&#40;T t&#41; &#123;
  Serializable t1 = t;
  Comparable&lt;T&gt; t2 = t;
  Cloneable t3 = t;
&#125;

Ou seja, um método que aceita um parâmetro que tem que ser Serializable, Comparable e Cloneable… oOO
Eu não sabia que isso era possível… com certeza vou dar um jeito de usar umas coisas dessas aqui hehehe

M

Por que o tipo do método apenas aceita CharSequence para cima, ou seja apenas CharSequence e Object.
String é CharSequence para baixa, caso <E extends CharSequence>, seria válido neste caso.

<? super ALGO> ----> ALGO e seus antecessores;
<? extends ALGO> ----> ALGO e seus sucessores;

L

Mateus, na real o que eu entendi é que ela queria saber por que é possível haver isso:

&lt;T extends CharSequence&gt; T x&#40;List&lt;T&gt; x&#41;

e não pode haver isso:

&lt;T super CharSequence&gt; T y&#40;List&lt;T&gt; y&#41;
Criado 15 de janeiro de 2008
Ultima resposta 21 de jan. de 2008
Respostas 7
Participantes 4