atribuição de genericos

gente, qual é o problema desse código?:


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…

q q eu faço? rsrs

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.

mas no caso que eu disse <? extends String> ele deveria aceitar alem das “filhas” de string, tambem a propria string não é?

ele não aceita nem a propria string

Você pôs <? extends Object>. Ponha <? extends String> , teste e veja se dá o mesmo resultado.
Dica: acho que deveria ser <? super String>

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!!!

Abracao

aiai

orbigado pelas respostas ate o moment …

cara … quanto mais entendo … mais me confundo ahua

eu to fazendo uma leitura errada então …

se <? extends Animal> … eu ACHAVA que dizia assim: posso colocar aki dentro qualquer coisa que extenda Animal…

mas pelo visto eu estou errrad …

se não é assim, como devo interpretar a clausula <? extends Animal>

( naquele exemplo que eu dei, funcionou com o super String,mas porque não com o extends string?)

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

Abracao