Olá pessoal estava testando alguns métodos envolvendo genéricos e me deparei com a seguinte situação:
//tenho este método que retorna um array lista de integer
public List<? extends Number> criarLista3() {
return new ArrayList<Integer>();
}
public static void main(String[] args) {
MetodosGenericos4 m = new MetodosGenericos4();
//aqui está a dúvida estou fazendo um casting de ArrayList<Integer> para ArrayList<Number>
//funcionou mas ao meu ver estaria errado pois não se pode fazer ArrayList<Number> = ArrayList<Integer>, tudo bem eu fiz o casting, mas o meu retorno está referenciando um ArrayList<Integer> isso não daria um erro????
ArrayList<Number> lista1 = (ArrayList<Number>)m.criarLista3();
lista1.add(new Float(12));
System.out.println(lista1);
}
Ao meu ver deu certo esse casting por causa do seguinte tipo de retorno no método
public List<? extends Number> criarLista3() { ... }
//com isso eu posso fazer o casting do subtipo para o supertipo na hora de chamar o método
Estou correto nesta afirmação???
Se alguém puder me ajudar, ficarei grato.
Vinícius.
Eh, ta complicado, estava fazendo uns testes aqui e teve uma coisa que me deixou mais confuso
porque isto funciona???
ArrayList<? extends Number> lista2 = new ArrayList<Number>();
//casting de ArrayList<Number> para ArrayList<String> porque isso funciona????
//a regra para casting de ArrayList é diferente da regra comum para casting de objetos????
ArrayList<String> lista4 = (ArrayList<String>)lista2;
lista4.add("1");
lista4.add("2");
lista4.add("3");
System.out.println(lista4);
eu tb nao conseguir compilar nao. As regras sao claras, para entender conjuntos + genericos tem que ler as regras, nao basta codificar e tentar entender na marra, tendo como base os erros do compilador.
compilei no java normal e ai não funcionou msm como eu esperava…
mas ai como que fica…
porq o eclipse faz isso???..
devo usar um outro editor para trabalhar com java???..
[quote=vmsb11]funciona aqui no eclipse…
vou tentar compilar no java normal…
mas msm assim no eclipse eu configurei ele para compilar no java 6…[/quote]
genericos eh recurso a partir do java 1.5 e na 1.6 nao houve alteracoes em relacao as regras de comportamento com genericos, o fato eh simples nao colocar Uvas na caixa de Maças.
eh aqui deu o mesmo erro compilando no console…
amigo LPJava eu ja tinha lido o seu post, muito bom msm…
eu estou entendendo as regras mas fiquei na dúvida por causa desse teste que eu fiz no eclipse ontem…
pelo oque eu estou vendo o eclipse que está fazendo uma confusão…
testei no netbeans e realmente não funcionou…
alguem sabe me dizer porq o eclipse alguns códigos por mais que se pareçam bizarros eles compilam e funcionam???..
obs: estou usando o MyEclipse v 5.5
Colocando uma chamada a lista4.get(0) que é o objeto Cachorro.
Acontece um erro:
Exception in thread "main" java.lang.ClassCastException: Cachorro cannot be cast to java.lang.String
at Teste.main(Teste.java:12)
Se chamo qualquer outro funciona beleza.
Não fui muito a fundo, mas parece que como na implementação do ArrayList ele armazena em um Object[] dentro da lista ele continua trabalhando mesmo com um objeto inválido.
E quando fazemos o get, por fazer referência ao generico String ele tenta fazer o cast e quebra tudo.
As vezes a gente encontra umas coisas engraçadas estudando estes exemplos.
Colocando uma chamada a lista4.get(0) que é o objeto Cachorro.
Acontece um erro:
Exception in thread "main" java.lang.ClassCastException: Cachorro cannot be cast to java.lang.String
at Teste.main(Teste.java:12)
Se chamo qualquer outro funciona beleza.
Não fui muito a fundo, mas parece que como na implementação do ArrayList ele armazena em um Object[] dentro da lista ele continua trabalhando mesmo com um objeto inválido.
E quando fazemos o get, por fazer referência ao generico String ele tenta fazer o cast e quebra tudo.
As vezes a gente encontra umas coisas engraçadas estudando estes exemplos.[/quote]
Engraçado msm esses exemplos… por isso é válido algumas vezes abrir o código fonte e ver como que é a implementação das coleções no java…