PriorityQueue<String> pq = new PriorityQueue<String>();
PriorityQueue<?> j= pq; // aqui funciona tudo bem
j.offer("zuelaiê"); /* aki da erro de compilação, mas se eu já falei qe pode ser ? qualquer objeto porque q ele não deixa eu botar uma string?*/
o código abaixio , mesma coisa:
PriorityQueue<String> pq = new PriorityQueue<String>();
PriorityQueue<? extends Object> j= pq; // tudo bem
j.offer("zuelaiê"); //da erro, mesmo eu tendo dito que podia ser qualquer q extenda Object
o pior, é que na hora que eu faço a atribuiçao , não da erro, só da erro na hora de inserir…
Uma PriorityQueue<E> só deixa inserir (ou seja, “offer”) elementos da classe E, ou de alguma classe que estenda E.
Isso é para evitar que a PriorityQueue deixe de ser uma PriorityQueue de E ao conter elementos de outras classes que não sejam E ou que não estendam E.
Como E == String, e não existe nenhuma classe que possa estender String porque ela é uma “final class”, então no seu caso você só pode declarar PriorityQueue <String> e nada mais.
Caro javando, voce esta enganado, pois basta fazer j.offer(new Object()); e vc vera o mesmo erro de compilacao. Veja o codigo abaixo;
import java.util.*;
class Teste{
public static void alimentarAnimais(List<? extends Animal> animais){
for(Animal a : animais)
a.comer();
}
public static void main (String... args){
List<Gato> gatos = new ArrayList<Gato> ();
gatos.add(new Gato());
gatos.add(new Gato());
gatos.add(new Gato());
List<Cao> caes = new ArrayList<Cao> ();
caes.add(new Cao());
caes.add(new Cao());
caes.add(new Cao());
caes.add(new Cao());
caes.add(new Cao());
alimentarAnimais(gatos);
alimentarAnimais(caes);
}
}
class Animal{
public void comer(){
}
}
class Gato extends Animal{
public void comer(){
System.out.println("gato comendo");
}
}
class Cao extends Animal{
public void comer(){
System.out.println("cachorro comendo");
}
}
O fato é que o wildcard “?” nao nos habilita a fazer
List <? extends Animal> animais = caes;
animais.add(new Cao());
pois estamos falando de generics e animais é uma referencia que aponta para um generic do tipo Cao, mas animais NAO é do tipo Cao, por isso quando tentamos adicionar um novo elemento a lista obtemos um erro de compilacao!!! A utilidade esta no codigo acima como exemplo. Voces podem ver que se retirarmos o wildcard na declaracao do metodo alimentarAnimais() nao podemos alimetar todos os animais de uma unica vez. Imagine se alguem aqui fosse dono de um Petshop!!!
Imagine o seguinte: Jaula jaulaLeao = new Jaula (); e Jaula jaulaBorboleta= new Jaula (); e voce fizesse jaulaLeao.add(new Borboleta()); É claro que as borboletas iriam escapar da jaula dos leoes…rsrsr… e por isso voce tem um erro de compilacao quando realiza a atribuicao jaulaLeao = jaulaBorboleta;
Quando fazemos Jaula<? extends Anima> jaula = jaulaLeao; voce diz ao compilador que jaula é uma referencia que apontara para qualquer GENERIC cujos elementos sejam subtipos de Animal. Mas imagine o problema que voce teria se fizesse: jaula.add(new Leao()) e depois jaula.add(new Zebra());…kkkkkkkk