atribuição de genericos

6 respostas
J

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

6 Respostas

T

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.

J

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

T

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

Vini_Fernandes

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

J

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?)

Vini_Fernandes

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

Criado 2 de fevereiro de 2009
Ultima resposta 2 de fev. de 2009
Respostas 6
Participantes 3