Ah vlw ^^
E quanto ao primeiro codigo?
Aki deu certim, estranhissimo XD
estranho msm…
aqui o primeiro código funcionou no eclipse…
mas no java normal não funcionou…
pessoal, veja as linhas abaixo:
sao diferentes o cast que está sendo feito.
ArrayList lista1 = (ArrayList)m.criarLista3();
Esse cast não deveria funcionar…
Pelo menos eu acho né ^^
[quote=C?ar.Rodolfo]ArrayList lista1 = (ArrayList)m.criarLista3();
Esse cast não deveria funcionar…
Pelo menos eu acho né ^^[/quote]
ele nao vai mesmo, se funcionasse eu poderia colocar qualquer coisa no meu array do tipo e isso nao eh permitido.
Compilei esse código no console do java msm
import java.util.*;
public class Teste {
public List<? extends Number> criarLista() {
return new ArrayList<Integer>();
}
public static void main(String[] args) {
Teste m = new Teste();
ArrayList<Number> lista1 = (ArrayList<Number>)m.criarLista();
lista1.add(new Float(12));
System.out.println(lista1);
}
}
E esse casting funcionou sim!!!..deu uma warning mas funcionou…
e pq ele nao funcionaria? nao vejo nada de errado nele. vc tem um metodo que retornar um List<? extends Number>
ou qualquer coisa que seja filho de Number.
aqui vc declaracou uma lista que vai receber o resultado o metodo que retorna um Number.
E depois vc adicionou um objeto Float no seu conjunto lista1 que está referenciado ao metodo que retorna List<? extends Number>
ele imprime com warnings pq a seguranca ai foi para o saco, ja que vc quebrou ela. isso ai eh o mesmo disso:
[code]public class TestGenerics {
/**
* @param args
*/
ArrayList lista = new ArrayList();
lista.add(new Float(12));
lista.add(new Integer(10));
System.out.println(lista);
}[/code]
ja isso aqui nao compila:
[code]public class TestGenerics {
/**
* @param args
*/
public static void main(String[] args) {
ArrayList<Number> lista = new ArrayList<Float>();
lista.add(new Float(12));
}
}[/code]
sim…isso ai eu ja entendi…
oque me deixou em dúvida é porq no retorno do método
return new ArrayList<Integer>();
retornei um array list de integer(até ai tudo bem, faz parte da regra de retorno que defini) mas na hora que eu faço casting
isso no meu entendimento está passando um array list de integer para number certo???
então oque eu entendi quando o tipo de retorno do método é <? extends ClasseX> eu posso fazer um casting de um subtipo para um supertipo na hora de chamar o método como eu fiz, está certo???
muito obrigado pela ajuda LPJava.
[quote=vmsb11]sim…isso ai eu ja entendi…
oque me deixou em dúvida é porq no retorno do método
return new ArrayList<Integer>();
retornei um array list de integer(até ai tudo bem, faz parte da regra de retorno que defini) mas na hora que eu faço casting
isso no meu entendimento está passando um array list de integer para number certo???
então oque eu entendi quando o tipo de retorno do método é <? extends ClasseX> eu posso fazer um casting de um subtipo para um supertipo na hora de chamar o método como eu fiz, está certo???
muito obrigado pela ajuda LPJava. [/quote]
qualquer um que passe no teste É-UM vc pode retornar quando se tem X extends Y.
entendi tudo LPJava…obrigado pela ajuda…
só tenho mais uma dúvida com relação a casting em genéricos…
quando eu faço:
ArrayList<Integer> lista1 = new ArrayList<Integer>();
//esse tipo de casting não é permitido né????
ArrayList<Number> lista2 = (ArrayList<Integer>)lista1;
mas quando eu declaro algo do tipo:
ArrayList<? extends Number> lista1 = new ArrayList<Integer>;
//esse casting é permitido né????
ArrayList<Float> lista2 = (ArrayList<Float>)lista1;
estou correto nisso???..
yes.