Questão sobre generics

8 respostas
jason_bourne

Pessoal,

Estou com dúvida nessa questão:

<T> void method(Collection<TIPO> c, T o){
   c.add(o);
}

Para que não ocorra erro de compilação, o valor de TIPO deve ser:
A) ?
B) ? super T
C) ? extends T
D) ? instanceof T
E) ? implements T

No gabarito esta como (B), mas eu não entendo, pq tem que sobrescrever a classe T???

8 Respostas

sergiotaborda

eduacsp:
Pessoal,

Estou com dúvida nessa questão:

<T> void method(Collection<TIPO> c, T o){
   c.add(o);
}

Para que não ocorra erro de compilação, o valor de TIPO deve ser:
A) ?
B) ? super T
C) ? extends T
D) ? instanceof T
E) ? implements T

No gabarito esta como (B), mas eu não entendo, pq tem que sobrescrever a classe T???

? implements T e ? instanceof T não existem.
Só ? não funcionaria pois uma coleção de “indefenido” não aceita add de "algo definido"
Ou seja, com ? o compilador não sabe se é uma coleção de T ou não e por isso não permite.
Sobre ? extends T e ? super T.

Entenda que apenas T funcionaria.
Porque super e não extends ? Porque extends singificaria que a coleção poderia ser de um subtipo de T
Uma coleção de subtido não pode aceitar um supertipo. Por exemplo

void method(Collection c, T o)

me permite passar uma coleção de String e ‘o’ ser um StringBuilder. Vai dar problema depois quanto tentar iterar a coleção com String.

Então, por exclusão de partes sobre “? super T”.

jason_bourne

sergiotaborda:
eduacsp:
Pessoal,

Estou com dúvida nessa questão:

<T> void method(Collection<TIPO> c, T o){
   c.add(o);
}

Para que não ocorra erro de compilação, o valor de TIPO deve ser:
A) ?
B) ? super T
C) ? extends T
D) ? instanceof T
E) ? implements T

No gabarito esta como (B), mas eu não entendo, pq tem que sobrescrever a classe T???

? implements T e ? instanceof T não existem.
Só ? não funcionaria pois uma coleção de “indefenido” não aceita add de "algo definido"
Ou seja, com ? o compilador não sabe se é uma coleção de T ou não e por isso não permite.
Sobre ? extends T e ? super T.

Entenda que apenas T funcionaria.
Porque super e não extends ? Porque extends singificaria que a coleção poderia ser de um subtipo de T
Uma coleção de subtido não pode aceitar um supertipo. Por exemplo

void method(Collection c, T o)

me permite passar uma coleção de String e ‘o’ ser um StringBuilder. Vai dar problema depois quanto tentar iterar a coleção com String.

Então, por exclusão de partes sobre “? super T”.

Sim…mas porque sobrescrever T? eu não poderia simplesmente colocar ?

LPJava

nao é válido usar ? nesse caso… se vc tiver lendo o capitulo da kathy no final do capitulo de generics tem as regrinhas pq nao pode usar ? para esse seu exemplo dar uma revisada la… olhe o exemplo abaixo:

//importacao das classes aqui
class X{
public static  void andar(List<? extends Object>lista){}
public static void main(String args[]){
List<Object> lista = new ArrayList<Object>();
andar(lista);
}
}

isso é diferente do seu exemplo nesse caso aqui posso usar o ? pq nao se trata de genericos em si… até pq se eu tirar os tipos aqui isso roda na versao 1.4 tranquilamente…
O seu codigo é um exempl o classico de genericos… e como ? nao é um identificador valido entao nao vale… lembra quais sao os identificadores validos em java? Entao eles podem ser usados em genericos.

flw!!

jason_bourne

LPJava:
nao é válido usar ? nesse caso… se vc tiver lendo o capitulo da kathy no final do capitulo de generics tem as regrinhas pq nao pode usar ? para esse seu exemplo dar uma revisada la… olhe o exemplo abaixo:

//importacao das classes aqui
class X{
public static  void andar(List<? extends Object>lista){}
public static void main(String args[]){
List<Object> lista = new ArrayList<Object>();
andar(lista);
}
}

isso é diferente do seu exemplo nesse caso aqui posso usar o ? pq nao se trata de genericos em si… até pq se eu tirar os tipos aqui isso roda na versao 1.4 tranquilamente…
O seu codigo é um exempl o classico de genericos… e como ? nao é um identificador valido entao nao vale… lembra quais sao os identificadores validos em java? Entao eles podem ser usados em genericos.

flw!!

agora entendo…vlw!

Raff

Fala pessoal blza !!!
Seguinte amigo !!!
no codigo que você passo tem somente uma certo que é a ? super T, o motivo de não poder usar ? extends T e ? é simplismente por que no codigo está adicionando um elemento no Collection, eñtão não compila!

Já que você mostrarão uma pergunta sobre generico o que você acham dessa ?

public class Ponto&lt;X, Y&gt;{

public void go(X a1){}

public void go(Y a2){}

}// esté codigo compila ???? expliquem o motivo depois eu falo
LPJava
Raff:
Fala pessoal blza !!! Seguinte amigo !!! no codigo que você passo tem somente uma certo que é a
? super T
, o motivo de não poder usar
? extends T
e
?
é simplismente por que no codigo está adicionando um elemento no Collection, eñtão não compila!

public static <T> void testar(List<?> rafa){

}// está certo? Sim pois não estou add nada.

public static <T> void testar(List<? extends T> rafa){

}está certo ? Novamente sim, não estou add nada....

public static <T> void testar(List<? super T> rafa){

rafa.add(.........);
}// está certo..e ele pode add normalmente.

Já que você mostrarão uma pergunta sobre generico o que você acham dessa ?

public class Ponto&lt;X, Y&gt;{

public void go(X a1){}

public void go(Y a2){}

}// esté codigo compila ???? expliquem o motivo depois eu falo

na minha opniao nao compila, pq se vc passar o mesmo tipo para X,Y entao a regra de fundamentos de ter dois metodos com mesmo tipo de retorno e mesmo args. Apesar de ser uma variavel diferente, mais qdo passar o tipo pode ser igual e nem eu nem vc sabe qual tipo vai ser passado ai se mudar o nome do metodo isso compila.

Bom foi o q pensei..

Raff

Como eu esperava de você Camilo Certinho :smiley:

LPJava

hauah que nada!! tudo sempre acaba nas regras de fundamentos, OO etc…se nao lembrar delas nao dar para aprender generics, api etc… alguem poderia implementar isso, se nao lembra mais das regras…

Criado 27 de dezembro de 2007
Ultima resposta 29 de dez. de 2007
Respostas 8
Participantes 4