Generics

Galéra alguêm poderia me dar uma explicação detalhada dessa questão? Desculpem mas não entendi praticamente nada.

A resposta corréta é a letra F.
:cry:

Quais declarações de poderiam ser inseridas no comentário INSIRA A DECLARAÇÃO AQUI de forma que o progrma compile e rode?

[code]
import java.util.*;

public class LongWordFinder {

public static void main(String[] args) {
	String[] array = {"123", "12345678", "1", "12", "1234567890"};
	List <String> list = Arrays.asList(array);
	Collection<String> resultList = getLongWords(list);
}
//INSIRA A DECLARAÇÃO DE MÉTODO AQUI.
{
	Collection<E> longWords = new ArrayList<E>();
	for(E word: coll)
		if(word.length() > 6) longWords.add(word);
	return longWords;
}	

}[/code]

A) public static Collection<? extends CharSequence>
getLongWords(Collection coll)

B) public static List
getLongWords(Collection coll)

C) public static Collection
getLongWords(Collection coll)

D) public static List
getLongWords(Collection coll)
E) public static List<? extends CharSequence>
getLongWords(Collection<? extends CharSequence> coll)

F) static public Collection
getLongWords(Collection coll)

G) static public Collection
getLongWords(Collection coll)

A única alternativa que atende ao problema é a F, porque o método:

  1. Retorna uma Collection de um tipo E genérico que implementa a interface CharSequence. No caso, E é do tipo String;

  2. Recebe uma Collection de um tipo E genérico que implementa a interface CharSequence; No caso, E é do tipo String e a Collection é uma List;

  3. É estático; necessário pois é chamado a partir de um método estático ( main ).

Espero ter ajudado.

[quote=rdomartins]A única alternativa que atende ao problema é a F, porque o método:

  1. Retorna uma Collection de um tipo E genérico que implementa a interface CharSequence. No caso, E é do tipo String;

  2. Recebe uma Collection de um tipo E genérico que implementa a interface CharSequence; No caso, E é do tipo String e a Collection é uma List;

  3. É estático; necessário pois é chamado a partir de um método estático ( main ).

Espero ter ajudado.[/quote]

Sinceramente não to conseguindo compreender muito n. Eu não consigo enchergar pq ta certo ou pq ta errado.
Compreende?

Você não entendeu um ponto em específico? Algo relacionado à sintaxe da assinatura do método genérico ou ao ponto onde ele é inserido no código?

Axo que a assinatura do método.

Dá uma lida nesses tutoriais:

http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html

http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Qualquer dúvida é só falar.

Inglês.
:cry:

A maior parte da informação, pelo menos as mais confiáveis e completas, está em inglês.

Posso perquisar alguma documentação em português sobre generics, mas sugiro que você aproveite para treinar o inglês, pois hoje conhecer uma segunda língua não é mais diferencial: tornou-se algo que espera-se seja inerente a todo profissional.

É um conselho.

bom vamos la… olha como analise essa questao:

[quote]A) public static Collection<? extends CharSequence>
getLongWords(Collection coll) [/quote]

  • Invalido pq ? nao é um modificador válido para generics

[quote]B) public static List
getLongWords(Collection coll) [/quote]

o tipo de retorno é invalido é uma List e observe que o metodo retorna Collection. que é pai de List.

[quote]D) public static List
getLongWords(Collection coll) [/quote]

Olha o tipo de retorno do metodo novamente invalido. A letra E é o tipo de retorno do metodo novamente.
Agora as C,G eu nao conseguir acha o pq… mais nao marcaria eles…

Bom acho que isso mais… meio confusa essa questao nao tem coisa desse tipo la nao ta mais leve hehe em relacao a generics… o q tem muito é a mistura do 1.4 com 1.5…

[quote=anderson.bonavides]Galéra alguêm poderia me dar uma explicação detalhada dessa questão? Desculpem mas não entendi praticamente nada.

A resposta corréta é a letra F.
:cry:

Quais declarações de poderiam ser inseridas no comentário INSIRA A DECLARAÇÃO AQUI de forma que o progrma compile e rode?

import java.util.*;


public class LongWordFinder {

	public static void main(String[] args) {
		String[] array = {"123", "12345678", "1", "12", "1234567890"};
		List <String> list = Arrays.asList(array);
		Collection<String> resultList = getLongWords(list);
	}
	//INSIRA A DECLARAÇÃO DE MÉTODO AQUI.
	{
		Collection<E> longWords = new ArrayList<E>();
		for(E word: coll)
			if(word.length() > 6) longWords.add(word);
		return longWords;
	}	
}[/code]

A) public static <E extends CharSequence> Collection<? extends CharSequence>
		getLongWords(Collection<E> coll)

B) public static <E extends CharSequence> List<E>
		getLongWords(Collection<E> coll)

C) public static Collection<E extends CharSequence>
		getLongWords(Collection<E> coll)

D) public static List<CharSequence>
		getLongWords(Collection<CharSequence> coll)
E) public static List<? extends CharSequence>
		getLongWords(Collection<? extends CharSequence> coll)

[b]F) static public <E extends CharSequence> Collection<E>
		getLongWords(Collection<E> coll)[/b]

G) static public <E super CharSequence> Collection<E>
		getLongWords(Collection<E> coll)[/quote]


vamos lá 

a) está tudo ok! Com exceção do tipo de retorno que é muito "extenso..." note que voce espera [code]Collection<String> e não Collection<? extends CharSequence >[/code] se fosse [code]Collection<? extends CharSequence> resultList = getLongWords(list)[/code] estario tudo OK !!!!

b) está não vai compilar porque dentro do metodo getLongWords() faz [code]Collection<E> longWord = new ArrayList<E>(); [/code] e retorna isso sendo que o teste é - um falha (Collection é uma List ?(falha...))

c) é uma sintaxe incorreta o metodo aqui não está sendo uma método genérico correto!! ele é assim
[code]public static Collection<E extends CharSequence>  getLongWords(Collection<E> c){...}[/code]
note que para um metodo ser generico precisa declarar que o mesmo é generico, e esse metodo não faz isso !

d) esse de cara já da para matar que está errado pois isso é a parte mais simples de generico.. vamos lá um exemplo.. 
[code]List<Integer> inter;
List<String> stringg;
inter = stringg; // isso é correto ?// esse é um dos motivos desse metodo não poder ser o correto.

e) a sintaxe do metodo está certinha mas o que está errado é o tipo de retorno do metodo.

f) é o certo.

g) está errado a sintaxe não se pode usar public static <E super CharSequence> ....... somento a palavra extends…

valow espero ter ajudado !

qualquer duvida só gritar!

import java.util.*;


public class LongWordFinder {

	public static void main(String[] args) {
		String[] array = {"123", "12345678", "1", "12", "1234567890"};
		List &lt;String&gt; list = Arrays.asList(array);
		Collection&lt;String&gt; resultList = getLongWords(list);
	}
// A) não vale porque getLongWords retorna uma Collection&lt;? extends CharSequence&gt; que
// nem sempre é um Collection&lt;String&gt;. (Embora uma Collection&lt;String&gt; seja uma Collection&lt;? extends CharSequence&gt;,
// o contrário não é verdade.
// B) não compila porque o tipo de retorno é List&lt;E&gt;, mas estamos tentando retornar uma Collection&lt;E&gt;.
// (Embora uma List&lt;E&gt; seja uma Collection&lt;E&gt;, o contrário não é verdade.
// C) não compila porque, para um método estático, é necessário especificar o tipo &lt;E&gt; antes
// da declaração do tipo de retorno. Neste caso, deveria ser: &lt;E extends CharSequence&gt;. Ou seja:
//	public static &lt;E extends CharSequence&gt; Collection&lt;E&gt; getLongWords(Collection&lt;E&gt; coll) 
// D) não compila porque E não está especificada em lugar nenhum
// E) não compila porque E não está especificada em lugar nenhum
// F) compila OK
// G) Podemos usar &lt;E extends CharSequence&gt;, mas não &lt;E super CharSequence&gt;; no máximo, 
// &lt;? super CharSequence&gt;. 

    static public &lt;E extends CharSequence&gt; Collection&lt;E&gt; getLongWords(Collection&lt;E&gt; coll) 
	{
		Collection&lt;E&gt; longWords = new ArrayList&lt;E&gt;();
		for(E word: coll)
			if(word.length() &gt; 6) longWords.add(word);
		return longWords;
	}	
}

thingol o E compila sim cara o que está errado é o tipo de retorno !!

Testei uma por uma; a E não compila mesmo, porque o parâmetro E não está especificado no cabeçalho do método.

aqui compilar se eu mudar para isso eu não preciso expecificar nada… note


public static void main(String... rafa){
String[] array = {"123", "12345678", "1", "12", "1234567890"};   
        List &lt;String&gt; list = Arrays.asList(array);   
        Collection&lt;? extends CharSequence&gt; resultList = getLongWords(list);   // so mudar o tipo aqui....

}


public static List&lt;? extends CharSequence&gt; 
	getLongWords(Collection&lt;? extends CharSequence&gt; coll) {
		return new ArrayList&lt;CharSequence&gt;();
	}

Ralf, thingol, LpJava e rdomartins. Muito obrigado vocês pela força. Essa galéra do Guj é muito gente fina. Apesar de já ter feito a prova acho q não cai nenhuma questão grande assim ou cai?
rs vlw a todos!

Cai não. Eles não perguntam tal tipo de coisas compridas.

hahauhauhauh

Complicado uma questão dessas. O kra passa 5 minutos só matutando o código para responder.
:roll:

muito chato mesmo !