Duvida em Generics

4 respostas
cu_ringa

Pq esse código n compila? o problema é na linha 4, mas n touconseguindo entender o pq. Se declaro um List de Object pq n posso colocar um Object nele?

package generics;

import java.util.ArrayList;
import java.util.List;

public class Generico2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		List &lt? super Integer&gt al = new ArrayList<Object>(); //line 1
	    al.add(12);                                             //line 2       
	    al.add(12+ 13);                                         //line 3
	    al.add(new Object());									//line 4
	    
	    for (Object no:al)                                     //line 5       
	    {
	        System.out.println(no);
	    }
		
	}

}

Se eu fizer:

List &lt? super Integer&gt al = new ArrayList<Number>(); //line 1

Significa q o tipo da lista é Number, ou é qlq superclasse de Integer além dela mesma?

4 Respostas

R

Quer dizer isso… e, por isso vc nao pode colocar Object… porque pleo fato de o tipo ser qualquer coisa que eh super classe de Integer, pode ser por exemplo um Number… e se vc tentar colocar um Object em uma lista que recebe Number pode dar erro. Por isso, vc só pode colocar Integer. Em tempo de compilação não tem como saber qual vai ser o real tipo do objeto, por isso dá erro.

LPJava

vc pode colocar um Integer ou um number, mais nao um Object, lembre-se qualquer classe em java é um Object, entao ai vc poderia colocar a coisa errada… :smiley: String é um Object, sua_class É-um Object.

R

LP, ele não pode colocar um Number não, seguindo a mesma idéia que vc disse que se isso fosse possível, ele poderia colocar a coisa errada.

lembre-se de que um Number poderia ser um Double ou um Float, por exemplo… e se ele tentasse colocar um desses em uma coleção de Integer, daria erro do mesmo jeito.

se preferir, pode fazer o teste:

List <? super Integer> al = new ArrayList<Object>();
Number n = 2;
al.add(n); //Erro aqui.

Inclusive, vcs podem ver que no autocomplete do IDE, pelo fato do tipo genérico ser <? super Integer>, o método add já é modificado para receber um Integer e, portanto, só pode-se colocar algo que passe no teste É-UM Integer.

[]'s

LPJava

hum é verdade… eu me confudi… ele so pode colocar o que passa no teste é-um para integer… e Number não é um integer o inverso é eh verdade se fosse <? super Number> Ja que um Integer é-um number.
olha essa classe:

import java.util.*;
class Carnaval{}
class Banda extends Carnaval{}
class Bloco extends Banda{}
class Chi{
	public void carna(List<? super Banda> band){
		band.add(new Banda());
		band.add(new Bloco());
	}
	public static void main(String [] agr){
		Chi ch = new Chi();
		List<Carnaval> lis = new ArrayList<Carnaval>();
			
		ch.carna(lis);
	}}

o meu metodo so recebe superclass de Banda que é carnaval se eu passar um conjunto para o método do tipo bloco ele nao compila, porem eu posso adicionar ao meu conjunto tudo que passar no teste é-um para Banda.

Criado 16 de agosto de 2007
Ultima resposta 17 de ago. de 2007
Respostas 4
Participantes 3