Genéricos (Respondido)

Dado um metedo declarado como:
public static List<? super E> process(List nums)

Um progrma deseja usar esse método da seguinte forma:

//INSIRA AS DECLARAÇÕES AQUI.

output = process(input);

a) ArrayList input = null;
ArrayList output = null;

b) ArrayList input = null;
List output = null;

c) ArrayList input = null;
List output = null;

d) List input = null;
ArrayList output = null;

e) List input = null;
ArrayList output = null;

e) List input = null;
List output = null;

B, E e F estão correas.

Alguêm poderia me dar uma força, não entendi a conclusão da resposta.

Cara, estou estudando pra certificação e tinha exatamente essa pergunta no capitulo 7. Nenhuma das alternativas batia, resolvi procurar no google, e achei sua dúvida, sem resposta alguma :frowning:

Continuei pesquisando e pelo que me pareçe é um erro do livro, a pergunta certa é:
public static List process(List nums)

note que ao invés de List<? super E> como diz o livro, a pergunta original é List

fonte: http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=24&t=030902

Att,

Eu vou dar uma olhada no assunto novamente e posto em seguida.
=]

vlw pela dica.

[quote=anderson.bonavides]Dado um metedo declarado como:
public static List<? super E> process(List nums)

Um progrma deseja usar esse método da seguinte forma:

//INSIRA AS DECLARAÇÕES AQUI.

output = process(input);

a) ArrayList input = null;
ArrayList output = null;

b) ArrayList input = null;
List output = null;

c) ArrayList input = null;
List output = null;

d) List input = null;
ArrayList output = null;

e) List input = null;
ArrayList output = null;

e) List input = null;
List output = null;

B, E e F estão correas.

Alguêm poderia me dar uma força, não entendi a conclusão da resposta.
[/quote]

po pegadinha isso ai…to analisando aqui o codigo a 30min e a conclusao que cheguei:
e a pegadinha é aqui output = process(input);

a invaliado. por que? observe o tipo de retorno do metodo é um List e e to fazendo na letra a algo tipo isso:

ArrayList  =  List

isso nao pode certo?

b nao há problema aqui. qual o problema de List receber um ArrayList?

c os tipos sao diferentes entao nao posso ter:

[code]
List = ArrayList

d mesmo problema acima

e,f não problemas nenhum

cara essa questao que sabero o uso de genericos mais ainda se saber o funcionamento de tipo… so q ele usou a complexidade ao infinito…
se ele fizesse assim:

List<Integer> list = new ArrayList<Number>();

vc ia marcar logo de cara nao compila… hehe… entao ele quer prova se vc sabe a regra de genericos em codigos mais complexos… hehe mata o cara. uma questao dessa eu fazia no papel como aconteceu la… tee questao que tive que fazer linha a linha no papel… sempre vai ter umas 2 ou 3 questoes q vai ter usar o papel, devido as pegadinhas desse tipo…
se eu tiver errado nas respostas acima me corrigam… mais foi o que eu conseguir tirar da questao olhando… o pq que as outras estavam erradas e essa estavam certas…

flw!!

Na verdade, nenhuma dessas alternativas está certa, justamente por causa do retorno:
public static List<? super E> process(List nums)

O tipo de retorno está muito genérico…

[quote=anderson.bonavides]Dado um metedo declarado como:
public static List<? super E> process(List nums)

Um progrma deseja usar esse método da seguinte forma:

//INSIRA AS DECLARAÇÕES AQUI.

output = process(input);

a) ArrayList input = null;
ArrayList output = null;

b) ArrayList input = null;
List output = null;

c) ArrayList input = null;
List output = null;

d) List input = null;
ArrayList output = null;

e) List input = null;
ArrayList output = null;

e) List input = null;
List output = null;

B, E e F estão correas.

Alguêm poderia me dar uma força, não entendi a conclusão da resposta.
[/quote]

Galera: E extends Number. List<? super E> quer dizer que o retorno tem que ser do tipo NUMBER.
eliminando assim as respostas a, b, d, f.

as respostas corretas são c , e

[]s
Gunnar

impossivel!!! faça o teste e tente compilar, você com certeza não vai conseguir…

Fiz alguns testes…
não sei porque não funciona. Mas o problema é com a declaração de output.
Se o output for declarado sem usar Generics funciona.


package Generics;

import java.util.*;

public class Guj{

	public static <E extends Number> List<? super E> process(List<E> list){
		return new ArrayList<Number>();
	}

	public static void main(String[] args){
		
		ArrayList<Integer> input = null; 
		List output = null; 
		output = process(input);

	}

}

Eu, na prova, marcaria as opções (c , e) de qualquer forma.
E pode ser de QUALQUER tipo. E só tem uma super classe comum a todos os Objetos…a classe OBJECT. Só que se tentar declarar List output = null; não compila. Só funciona se não usar Generics para output…(o que é o mesmo que List output).

[]s
Gunnar

Na verdade a unica resposta plausivel seria List<?> l = output ou List l = output, como voce disse

Mais o que aconteçe é que essa pergunta está no livro da Kathy Sierra. Segundo o livro a resposta certa seria as alternativas B, E e F. O QUE É UMA MENTIRA.
Caso você leia a o topico desde o começo, verá que a discussão é justamente sobre isso, um erro do livro, nenhuma dessas alternativas está correta. Segundo informações a pergunta certa seria:

public static [color=red]List[/color] process(List nums)

O Problema é com a PERGUNTA, não com as respostas :wink:

Depois de muito estudar e analizar consegui compreender onde tava o erro. É verdade o erro se econtra na sintaxe do método e não nas respostas.