import java.util.*;
class Animal{}
class Dog2 extends Animal{}
public class Gen3 {
public static void go(Set<Dog2> d){}
public static void main(String[] args){
//Inserir opção aqui.
go(t);
}
}
Para manter a compatibilidade de códigos antigos pré-genéricos com códigos novos (a partir de java 5). Repare que o código compila com avisos exatamente por esse motivo, para chamar a atenção do programador de que problemas poderão ocorrer em tempo de execução.
Raff
somente a Opção 1 compila com o nosso amigo javadev falow !!!as outras são tipos imcopátiveis de Genericos…
anderson.bonavides
Raff só quem é incompativel é a 3 opção já que ela é do tipo Animal e o método só aceita Dog. Mas entendi pq a primeira opção compila. Mas no meu pc o código não ta gerando avisos será pq a JVM é a 1.6?
ViniGodoy
A opção 2 não compila. Ela faz um set de Dog e o método exige um Set de Dog2.
Raff
só se você escreveu erro o código cara porque olha lá no metodo go(Dog2 o){} então poderia ser assim somente…
A opção 2 não compila. Ela faz um set de Dog e o método exige um Set de Dog2.
Desculpa thingol não reparei esse problema. Mas é Dog2 na opção 2 foi erro de digitação mesmo.
Vou corrigir o problema.
:lol:
anderson.bonavides
Quero agradecer a todos pela força.
F
fabioEM
Aproveitando o tópico aberto do nosso amigo anderson.bonavides
tenho o seguinte problema sobre genéricos:
No livro da Kathy Sierra 2 edição diz que este metodo a seguir:
importjava.util.*;classAnimal{Stringn;}classDogextendsAnimal{Dog(Stringi){n=i;}// public String toString(){// return n;// }}publicclassVai{static<T>voidadd(Tt){ArrayList<T>y=newArrayList<T>();y.add(t);System.out.print(y.get(0).n);///erro de compilacao ,parece que n nao esista,para ajeitar a unica saída seria <T extends Animal>}staticvoidadd2(Dogt){ArrayList<Dog>y=newArrayList<Dog>();y.add(t);System.out.println(y.get(0).n);}publicstaticvoidmain(String...a){add(newDog("cachorro"));}}
Não entendi o pq desse erro de compilação.No entanto se eu sobrescrever o metodos public String toString() {}imprime cachorro ,ou seja reconhece a variável de instância dentro de Dog.Bom galera, se alguem tiver uma sujestão seria uma boa, valeu!!
anderson.bonavides
Já verificou que sua classe Animal não tem um construtor com argumento? Eu não testei aki mas acho que vai ficar blz.
Espero ter ajudado. t+
F
fabioEM
anderson.bonavides:
Já verificou que sua classe Animal não tem um construtor com argumento? Eu não testei aki mas acho que vai ficar blz.
Espero ter ajudado. t+
Ja verifiquei cara mas nao é isso nao é algo bem mais sinistro…nao consigo entender cara !!mas valeu ai!!
marcosbrandao
fabioEM,
Para funcionar você precisa fazer uma conversão explicita.
Por que o compilador não sabe que “T” é um Animal. Então ele não vai achar o metodo n.
Eu poderia fazer isso e estaria correto:
Dogdog=newDog("cachorro");Vai.add(dog);
Mas eu também poderia fazer isso:
Alienalien=newAlien();Vai.add(alien);
em tempo de excução isto geraria um erro porque
alien não é um animal, portanto não tem o metodo n.
Por isso o compilador gera um erro.
F
fabioEM
Desculpas acabo de apagar a observacao errada que tinhya feito a vc marcosbrandao
e me corrijo, tens razao, realmente a única saida é fazer uma conversao explicita!!
obrigado a pressa é inimiga da perfeicao mesmo!!
F
fabioEM
Ola galera ,aproveitando esse tópico e fazendo um “reuso” como boa engenharia de computação , pq isso esta errado?observem:
classOpaOQueEisssoo{staticList<?extendsNumber>process(Listt){returnnull;}publicstaticvoidmain(String...a){ArrayList<Number>lista=newArrayList<Number>();List<Integer>listaInteger=process2(lista);//erro de compilacao}}
ou seja, tenho um tipo de retorno bem abrangente,mas ao mesmo tempo tempo o compilador nao açeita ,será que isso tem aver com apagamento de tipos que a Kathy fala no livro?
List=
Raff
fabioEM:
Ola galera ,aproveitando esse tópico e fazendo um "reuso" como boa engenharia de computação , pq isso esta errado?observem:
classOpaOQueEisssoo{staticList<?extendsNumber>process(Listt){returnnull;}publicstaticvoidmain(String...a){ArrayList<Number>lista=newArrayList<Number>();List<Integer>listaInteger=process2(lista);//erro de compilacao}}
ou seja, tenho um tipo de retorno bem abrangente,mas ao mesmo tempo tempo o compilador nao açeita ,será que isso tem aver com apagamento de tipos que a Kathy fala no livro?
List=
Olá Fábio bom dia. Seguinte cara da uma arrumanda ai no nome do seu metodo uma vc chama process no main() vc chama process2.. mas enfim nesse seu tipo de retorno a única coisa que compilaria seria se você tivesse algo do tipo...
staticList<?extendsNumber>process(Listt){returnnull;}publicstaticvoidmain(String...rafa){List<Integer>b=newArrayList<Integer>();List<?extendsNumber>a=process(b);// assim não daria erro de compilação teste ai !!!!}
[]'s
F
fabioEM
Raff:
fabioEM:
Ola galera ,aproveitando esse tópico e fazendo um "reuso" como boa engenharia de computação , pq isso esta errado?observem:
classOpaOQueEisssoo{staticList<?extendsNumber>process(Listt){returnnull;}publicstaticvoidmain(String...a){ArrayList<Number>lista=newArrayList<Number>();List<Integer>listaInteger=process2(lista);//erro de compilacao}}
ou seja, tenho um tipo de retorno bem abrangente,mas ao mesmo tempo tempo o compilador nao açeita ,será que isso tem aver com apagamento de tipos que a Kathy fala no livro?
List=
Olá Fábio bom dia. Seguinte cara da uma arrumanda ai no nome do seu metodo uma vc chama process no main() vc chama process2.. mas enfim nesse seu tipo de retorno a única coisa que compilaria seria se você tivesse algo do tipo...
staticList<?extendsNumber>process(Listt){returnnull;}publicstaticvoidmain(String...rafa){List<Integer>b=newArrayList<Integer>();List<?extendsNumber>a=process(b);// assim não daria erro de compilação teste ai !!!!}
[]'s
Ok entao quer dizer que o processo de eu dar um limite para algum tipo de retorno para um conjunto X deve sempre ser novamente refeito,ok beleza, mas entao para se dar o trabalho ,se depois deve sempre acrescentar o mesmo tipo de código?? :roll:mas valeu pelo esclarecimento!!