ArrayList<? extends ALGO> ... ArrayList<?>

11 respostas
JAVA_S

Galera, eu estou estudando o SCJP 5, e me deparei com o seguinte problema:

Suponhamos que eu tenha uma classe:

public abstract class Animal{

.

.

.

}

e uma outra:

public class Dog extends Animal{

.

.

.

}

Em uma outra classe eu tenho o seguinte método:

public class DB{

public ArrayList<? extends Animal> fazAlgo(){

.

.

.

}

}

e tenho uma outra classe assim:

public class DBFilha extends DB{

public ArrayList<?> fazAlgo(){

return super.fazAlgo();

}

}

eu gostaria de saber oq essa instrução ( ArrayList<?> )significa e como o java entende…

Alguem sabe???

11 Respostas

ViniGodoy

O wildcard ? é mais usado no valor de entrada do método, não no retorno.

Dizer List<?> significa dizer que é uma Lista, em que o tipo interno pode ser qualquer coisa.
Dizer List<? extends X> é dizer que é uma lista, em que o tipo interno pode ser qualquer coisa que seja filho de X.
E dizer List<? super X> é dizer que é uma lista, em que o tipo interno pode ser qualquer coisa que seja pai de X.

Por exemplo:

Essa método aceita como parâmetros de entrada uma Lista das classes Number - ou qualquer uma das suas filhas (Long, Integer, Short, Byte, Double, Float) - e um comparador, que pode ser da classe Number ou qualquer um dos seus pais (no caso, creio que só Object).

E retorna uma lista de objetos do tipo Number, provavelmente ordenada.

Ratao

Legal ViniGodoy, eu tbm nao sabia rsrsrs… Valew pela explicação.

anderson.bonavides

É bom frizar que sempre que utilizamos <?>, <? extends Animal> não podemos alterar um conjunto mas podemos vizualizalo. Podemos alterar quando se trata de <? super Dog>.

LPJava

bom depois da aula de vinny so vou complementar… é o que o anderson falou quando vc tem <?> vc nao pode add nada ao conjunto pq para o compilador vc pode adicionar a coisa errada ao conjunto... entao se ver na prova um metodo que tenha uma lista usando <?> e logo em seguinda add pode marcar que nao compila.

obs.: Generics é um recurso do java 1.5 :smiley:

anderson.bonavides

LPJava:
bom depois da aula de vinny so vou complementar… é o que o anderson falou quando vc tem <?> vc nao pode add nada ao conjunto pq para o compilador vc pode adicionar a coisa errada ao conjunto... entao se ver na prova um metodo que tenha uma lista usando <?> e logo em seguinda add pode marcar que nao compila.

obs.: Generics é um recurso do java 1.5 :D

É isso ai.

:wink:

JAVA_S

Vlw pessoal, ajudou msm…

boa explicação de todos…

Até a próxima de mtas dúvidas!!! xD

C

LPJava:
bom depois da aula de vinny so vou complementar… é o que o anderson falou quando vc tem <?> vc nao pode add nada ao conjunto pq para o compilador vc pode adicionar a coisa errada ao conjunto... entao se ver na prova um metodo que tenha uma lista usando <?> e logo em seguinda add pode marcar que nao compila.

obs.: Generics é um recurso do java 1.5 :D

Como assim? essa parte nao entendi nao…vc poderia dar um exemplo?

ViniGodoy

Veja bem… dentro do método que usa a ?, o wildcard não significa "qualquer coisa".
Significa "qualquer coisa que não sei o que é".

Portanto
List<?> != List<Object>

Então, no primeiro caso, um List<?> é uma lista de objetos que pertencem a uma classe específica, mas que é desconhecida do compilador.
No segundo, um List<Object> é uma lista onde os elementos podem ser de qualquer classe, mas o compilador sabe que qualquer classe é válida.

Por isso, não faz sentido ele deixar adicionar objetos em uma List<?>, já que ele não pode garantir que os objetos serão um tipo válido daquela lista.

C

Ow, agora saquei…entendi 100%…

Valeu pela ajuda!!!

Abracos!

marlon_patrick

galera…
agora…só pra voltar ao ambito da questão que deu inicio a essa discussão…
ele nem compila…
é uma subscrição inválida…

<? extends A> por <?>.....

O metodo subscritor tem que garantir que o que será retornado esta abaixo na arvore de A ou será o próprio A…
Um exemplo válido seria se…

B extends A…

então poderiamos subscrever dessa forma:

<? extends A> ..metodo original... <? extends B>..metodo subscritor valido, pois quem é filho de B é tambem filho de A...
LPJava

ceeduardo:
LPJava:
bom depois da aula de vinny so vou complementar… é o que o anderson falou quando vc tem <?> vc nao pode add nada ao conjunto pq para o compilador vc pode adicionar a coisa errada ao conjunto... entao se ver na prova um metodo que tenha uma lista usando <?> e logo em seguinda add pode marcar que nao compila.

obs.: Generics é um recurso do java 1.5 :D

Como assim? essa parte nao entendi nao…vc poderia dar um exemplo?

acho que isso ajuda veja:

[b]Validas[/b]
	
ArrayList<?>  list = new ArrayList();	

ArrayList<? extends Object> ll = new ArrayList<Object>();
	
ArrayList<?super Integer> it = new ArrayList<Number>();
	
ArrayList<?> qq = new ArrayList<Double>();
	
[b]Invalidas[/b]
	
ArrayList lis =new ArrayList<? extends Object>();
	//nao posso usar no objeto, o mesmo deve ter um tipo declarado
	
ArrayList<? extends Object> ob = new ArrayList<Object>();
	ob.add(new Object()); // nao posso adicionar nada ao meu conjunto

na essencia da coisa:

import java.util.*;
class Carta{}
class Coringa extends Carta{}
class Jogo{	
	public void cha(List<? extends Carta> car){
		car.add(new Carta()); 	}
	
	public static void main(String [] agrs){
		Jogo j = new Jogo();
		List<Carta> list = new ArrayList<Carta>();
		list.add(new Carta());
			j.cha(list);
	}}
/*não compila porque usei < ? >(interrogação) quando uso, digo ao compilador que pode receber um conjunto de qualquer subtipo, porém JAMAIS adicioná-lo ao conjunto, nem que seja do mesmo tipo.*/

espero ter ajudado… agora para fortalecer seu conhecimento na primeira parte que coloquei Validas Se pergunte pq sao validas? isso é tao importante quanto ficar lendo e lendo e as vezes nao entendo como deve… perguntar o POR QUE? é uma das melhores formas q encontrei para poder aprender assuntos como generics, threads… etc :smiley:

flw! espero ter ajudado… qualquer coisa so gritar :smiley:

Criado 19 de fevereiro de 2008
Ultima resposta 27 de fev. de 2008
Respostas 11
Participantes 7