Métodos que retornam genéricos [resolvido]

Oi povão XD

oia esse código aki:


package RevisandoCap7;

import java.util.ArrayList;
import java.util.Collection;



public class LongWordFinder {

	
	public static void main(String [] args){
		
		String[] array = {"123","12345678","1","12","1234567890"};
		java.util.List<String> list = java.util.Arrays.asList(array);

		java.util.Collection<String> resultList = getLongWords(list); // vai dar erro aqui
	}
	
	public static <E extends CharSequence> Collection<? extends CharSequence> getLongWords(Collection<E> coll)
	{
		
		Collection<E> longWords = new ArrayList<E>();
		for(E word : coll)
			
			if(word.length() > 6 ) longWords.add(word);
		return longWords;
		
	}
	
}

o código acima NÃO compila

na linha q provoca o erro (que é o cabeçalho do método getLongWords).
se eutrocar por:

aí vai compilar …

mas pq??

na linha com erro eu falei que o retorno ia ser <? extends CharSequence> e deu erro
na linha sem erro eu falei que o retorno ia ser (sendo que E foi declarado no método com sendo extends CharSequence ) e NÃO DÀ ERRO

Por que?? eu pensei que as duas declarações fossem equivalentes

VALEW gentee

se vc trocar a linha que ta dando erro para esta

java.util.Collection<String> resultList = (Collection<String>)getLongWords(list);

vai compilar…

acredito que não estava compilando pelo fato de não conseguir converter automaticamente… :frowning:
porém, não tenho certeza…

espero que ajude :smiley:

[]´s

public static <E extends CharSequence> Collection<E> getLongWords(Collection<E> coll)
Significa:
Seja E é uma subclasse de CharSequence, este método retorna uma Collection<E> e recebe uma Collection<E>. O E do parâmetro e do retorno são os mesmos.

public static <E extends CharSequence> Collection<? extends CharSequence> getLongWords(Collection<E> coll)
Significa:
Seja E é uma subclasse de CharSequence, este método retorna uma Collection<alguma coisa qualquer que se sabe ser um CharSequence> e recebe uma Collection<E>. O E do parâmetro e o generic do retorno podem não ser a mesma coisa.

Isso é semelhante a:public static &lt;E extends Animal&gt; Collection&lt;? extends Animal&gt; foo(Collection&lt;E&gt; c) { return new ArrayList&lt;Gato&gt;(); }Observe que aqui, o generic do retorno não tem relação com o generic do parâmetro. Como resultado, ao invocar este método passando um Collection<Cachorro> o compilador vai ver que “algum Animal” pode não ser a mesma coisa que “Cachorro”, e neste exemplo, não é mesmo, é o retorno é um Collection<Gato>.

Po Victor … entendi

valewwwxD