Tenho uma duvida na utilização do coringa! Minha duvida e a seguinte:
Quando faço o comando a baixo dá erro:
Integer[]arraySuper=newInteger[]{1,2,3,5,8,13};List<?superInteger>listaCuringaSuper=newArrayList<Integer>();listaCuringaSuper.addAll(Arrays.asList(arraySuper));listaCuringaSuper.add(21);listaCuringaSuper.add(34);Numbernumber=(Number)listaCuringaSuper.get(5);// retorna 8listaCuringaSuper.add(number);// Erro de compilação
Segundo a teoria de generics, quando uso o <? super T> significa que a própria classe ou uma super classe de T são aceitas. Me corrigam se estiver errado. So que o problema é que Integer estende Number! E porque dá erro de compilação?
<? super T> não é "a própria classe ou uma super classe de T", é "uma classe, cuja superclasse seja T, ou ela mesma (T)"
ou seja, no teu caso, listaCuringaSuper só vai aceitar Integer ou outra classe que extenda Integer, mas como Integer é final e não pode ter classes filhas, listaCuringaSuper só vai aceitar Integer mesmo.
O
oitavo_anjo
maschiojv:
<? super T> não é “a própria classe ou uma super classe de T”, é “uma classe, cuja superclasse seja T, ou ela mesma (T)”
ou seja, no teu caso, listaCuringaSuper só vai aceitar Integer ou outra classe que extenda Integer, mas como Integer é final e não pode ter classes filhas, listaCuringaSuper só vai aceitar Integer mesmo.
acho que a quetão é… pq o listaCuringaSuper aceitou number, sendo que number é do tipo List… acho que é que a linha
List<? super Integer> listaCuringaSuper = number; seja possivel por uma propriedade de herança, já que Number é a classe pai de Integer, entao todo objeto Integer é também um objeto Number e a linha listaCuringaSuper.add(number); // Erro de compilação ocorre um erro pq a adicão de um novo elemento a lista deve ser do tipo Integer, respeitando o generics
M
maschiojv
… apaguei pq tinha falado besteira
B
brucsantos
Deixa ve entendi:
Quando tenho <? super Integer> ele so aceitam a propria classe ou as classe que sejam filhos de Integer ?
Se foi isso então qual e a diferença entre <? extends Integer> e <? super Integer>?
Eu conhecia a seguinte definição:
<? extends Integer> --> "A propria classe ou uma subclasse de"
<? super Integer> --> "A própria classe ou uma superClasse de"
To mais confuso que antes! huahhhua
O
oitavo_anjo
<? super Integer>: classe Integer ou qualquer superclasse de Integer, como Number e Object.
<? extends Integer>: classe Integer ou qualquer classe que extenda Integer (subclasses).
Bom na list1 entendo que ele so aceita o B ,C e o D, pois, <? super ClasseB> aceita a propria classe B e as classes que estendam B.
Agora a duvida:
Por que na list2 todos dão erro???
Gera o seginte erro no eclipse:
Themethodadd(capture#11-of ? extends ClasseB) in the type List<capture#11-of ? extends ClasseB> is not applicable for the arguments (ClasseA)
B
brucsantos
Então… alguma opnião? alguem? Obrigado
E
emanuelCruz
Tambem estava com dúvidas quanto aos coringas.
A fim de ajudar quem possa passar por estas dúvidas, segue classe que implementei e que responde os questionamentos do tópico.
importjava.util.ArrayList;importjava.util.List;publicclassCoringasEmListas{staticclassA{privateStringnome;publicA(Stringnome){this.nome=nome;};publicStringtoString(){returnnome;}}staticclassBextendsA{publicB(Stringnome){super(nome);}}staticclassCextendsB{publicC(Stringnome){super(nome);}}staticclassDextendsC{publicD(Stringnome){super(nome);}}publicstaticvoidmain(String[]args){Aa=newA("A");Bb=newB("B");Cc=newC("C");Dd=newD("D");//Listas com ? extends, podem ser criadas para as classes cujo objeto instanciado passe no teste É-UM da classe informada//List<? extends B> listaExtends0 = new ArrayList<A>(); //Um objeto de A não passa no teste É-UM de BList<?extendsB>listaExtends1=newArrayList<B>();List<?extendsB>listaExtends2=newArrayList<C>();List<?extendsB>listaExtends3=newArrayList<D>();//listas com ? extends são somente leitura para inserção de objetos//listaExtends1.add(a);//inválido//listaExtends1.add(b);//inválido//listaExtends1.add(c);//inválido//listaExtends1.add(d);//inválido//Listas com ? super, podem receber qualquer objeto com hierarquia igual ou superior à classe informadaList<?superB>listaSuper0=newArrayList<A>();//A é super classe de B, ok !List<?superB>listaSuper1=newArrayList<B>();//B é a própria classe, ok !//List<? super B> listaSuper2 = new ArrayList<C>();//C extends B, por isto não pode ser usada//List<? super B> listaSuper3 = new ArrayList<D>();//D extends C e B, por isto não pode ser usada//listas com ? super, podem ter objetos inseridos, desde que este objeto passe no teste É-UM da classe informada //listaSuper0.add(a);//a não passa não É-UM BlistaSuper0.add(b);listaSuper0.add(c);listaSuper0.add(d);}}