Dúvida Questão 16 - Chapter 7 - SCJP Sun Certified (Kathy)

Galera, espero que alguem possa me ajudar, me deparei com a seguinte questão e não entendi esse maldito retorno na assinatura do metodo

// Given a method declared as:

public static <E extends Number> List<? super E> process(List<E> nums)

//A programmer wants to use this method like this:

// INSERT DECLARATIONS HERE
output = process(input);

//Which pairs of declarations could be placed at // INSERT DECLARATIONS HERE to allow
//the code to compile? (Choose all that apply.)

A. ArrayList<Integer> input = null;
ArrayList<Integer> output = null;

B. ArrayList<Integer> input = null;
List<Integer> output = null;

C. ArrayList<Integer> input = null;
List<Number> output = null;

D. List<Number> input = null;
ArrayList<Integer> output = null;

E. List<Number> input = null;
List<Number> output = null;

F. List<Integer> input = null;
List<Integer> output = null;

G. None of the above.

// B, E, and F are correct.
// The return type of process is definitely declared as a List, not an ArrayList, so A and D
// are wrong. C is wrong because the return type evaluates to List<Integer>, and that can't
// be assigned to a variable of type List<Number>. Of course all these would probably cause a
// NullPointerException since

Por que a Alternativa C não compila. Se alguem puder me ajudar agradeço.
“C is wrong because the return type evaluates to List”, A assinatura do metodo volta um “List<? super E>” ao invez de apenas “List”. Poderia ser um erro do livro?

[quote=SPWilson]

[/code]
Bem vindo meu amigo!Esse é so mais um erro ehehe do livro também fiquei nervossimo com essa questão ,cara pelo que entendi é esse tipo de retorno que confunde tudo List<? super E> ,ou seja qualquer classe que esta acima de E mas a pergunta o diabos é EEEEE??
se cololar como retorno um List ai da certo

Vlw Fabio, Menos mau hehe, quando achei que tinha pegado o jeito me deparo com uma questão desse tipo, fode hehe… mas Beleza :D, e pelos teste que eu fiz nenhuma das alternativas que o livro fala que compila, realmente compila! Abraço

vamos lá:
isso:

quer dizer que “E” (uma convenção apenas) pode ser um Number ou uma subclasse(por exemplo Integer)…

aqui:

é o tipo de retorno deve ser um List, e pode ser um “E” ou um supertipo de “E”…
mas quem é “E”, esse é o que expliquei acima, ele pode ser um Number ou uma subclasse…

a resposta C não vai compilar porque aqui:

vc está atribuindo o input ao output…ou seja …na letra C, vc está querendo fazer isso:
colocar o ArrayList no List, vc não pode fazer isso porque o generics só aceita mesmo tipo:
Integer com Integer, Number com Number, Carro com Carro…

ou seja, vc pode retornar nesse método um List ou List nesse caso…

não sei se consegui ser claro…
flw Hewerton

Heverton, eu tinha chegado a essa conclusão mas quando tentei fazer o teste abaixo em uma das alternativas que o livro da como certa obtive erro de compilação. Não sei se estou fazendo caca, Teoricamente passando um Integer retornaria um Integer ou Number e compilaria mas não é o que acontece a não ser que eu mude o retorno para “List”

[code]package Revisao;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class GenericosTT {
public static List<? super E> process(List nums){

		return new ArrayList<E>();
		
	}
	
		public static void main(String[] args) {
		    ArrayList<Integer> input = null;  
			List<Integer> output = null;  
			  
                            //Erro de compilação aqui, cannot convert to List <capture.....
			output = process(input);  
		
	}

}
[/code]

colega quanto a isso, não posso garantir, mas creio que não seja um erro do livro, sim pela lógica vc poderia sim retornar um Integer, mas o problema dessa questão “C”, não chega ser o retorno, mas sim a atribuição que está tentando ser feita, eh isso:

tudo bem um List receber um ArrayList, mas os tipos são diferentes, Number apesar de superclasse de Integer, sempre devem ser tipo iguais…pelo menos foi que sempre levei na mente após ler a documentação…
vlw Hewerton

colega quanto a isso, não posso garantir, mas creio que não seja um erro do livro, sim pela lógica vc poderia sim retornar um Integer, mas o problema dessa questão “C”, não chega ser o retorno, mas sim a atribuição que está tentando ser feita, eh isso:

tudo bem um List receber um ArrayList, mas os tipos são diferentes, Number apesar de superclasse de Integer, sempre devem ser tipo iguais…pelo menos foi que sempre levei na mente após ler a documentação…
vlw Hewerton[/quote]

Desculpas ,mas cara o livro cita cita como certa os item B E e como vc viu estão erradas pra min se não é erro do livro é discuido,ou seja mesma coisa.Mas acho que pode acontecer não é o fim do mundo,as vezes ate ajuda eheh o cara tem que estudar mais fazer o que :smiley:

[quote=SPWilson]Heverton, eu tinha chegado a essa conclusão mas quando tentei fazer o teste abaixo em uma das alternativas que o livro da como certa obtive erro de compilação. Não sei se estou fazendo caca, Teoricamente passando um Integer retornaria um Integer ou Number e compilaria mas não é o que acontece a não ser que eu mude o retorno para “List”

[code]package Revisao;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class GenericosTT {
public static List<? super E> process(List nums){

		return new ArrayList<E>();
		
	}
	
		public static void main(String[] args) {
		    ArrayList<Integer> input = null;  
			List<Integer> output = null;  
			  
                            //Erro de compilação aqui, cannot convert to List <capture.....
			output = process(input);  
		
	}

}
[/code][/quote]

sim colega, vc não pode retornar um ArrayList INDEPENDENTE do tipo que seja, Number ou Integer, veja aqui:

seu método está claro, vc SOMENTE poderá retornar um LIST, pode ser um List ou List mas de maneira alguma um ArrayList…

estou me baseando no que vc digitou no método…o que vc colocou realmente só funciona se retornar List

Heverton, acho que eu entendi errado. Voce está me dizendo que não posso retornar um ArrayList se na assinatura do meu metodo o retorno estiver como List?

Vlw!
Abraço

Existe a possibilidade de o livro estar errado, pois se for trocado o tipo de retorno de List<? super E> para List, as explicações na resposta da questão fazem total sentido.

È isso que penso :wink: mia tia sempre dizia; errar é humano perseverar é :evil: diabolico eheheheh

pode ser… mas o que eu entendi lendo a documentação… diante do que foi colocado, as questões B,E,F… pra mim estão corretas…
aqui retorna um List…ok

 B. ArrayList<Integer> input = null;  
 List<Integer> output = null;  

aqui retorna um List…ok

 E. List<Number> input = null;  
 List<Number> output = null;  

aqui retorna um List…ok

F. List<Integer> input = null; List<Integer> output = n

ou seja está dentro do esperado, um retorno do tipo List ou List… não estou querendo concordar com o livro, ele pode estar errado, mas estou apenas expondo o que eu aprendi… se alguém mais experiente puder opinar seria bem vindo…

Qual é o tipo de retorno que colocaste no metodo inicial?Eu to seguindo a logica do metodo e realmente as resposta B E F estariam erradas
pois os tipo de retorno sao todos mais especificos!

public class ConjuntoPega {
      
public static <E extends Number> List<? super E> process(List<E> nums) { 

 List<? super E> output=null;
  return output;//mesmo tipo de retorno declarado acima seguindo a lógica do metodo
}
  /*A programmer wants to use this method like this:   
     INSERT DECLARATIONS HERE   
     output = process(input);   
     eu vejo o seguinte:
  encontre o tipo de retorno certo para nao dar erro de compilacao
  */
       public static void main(String[] args) {
          /*B) ArrayList<Integer> input = null;     
               List<Integer> output = null;   erro de compilacao
           
          E) List<Number> input = null;  erro de compilacao    
          List<Number> output = null;   
           output=process(input);
           
           F) List<Integer> input = null;  //erro de compilacao    
              List<Integer> output = null
             output=process(input);
           */
           
            //assim da certo pois o tipo de retorno é genérico  
             List<Integer> input = null;    
             List output=null;
             output=process(input);
     
          
           
       }

    
   
    
} 

Desculpem por desenterrar o tópico, mas acabei de cair nessa pegandinha e fiquei algumas horas meditando sobre o que eu estava fazendo de errado.
No final das contas, a questão anterior (14) da uma resposta, quase que uma premonição, dizendo que no método

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

o retorno é vago demais, o que faz crer que retornos não devem usar coringas/wildcards.