Bem tenho duvidas sobre por qual motivo as linhas abaixo não compilam…
List<? extends Object> lista = new ArrayList<Integer>();// Não poderia instanciar qualquer coisa que fizer extends Object ?
ArrayList<Number> lista = new ArrayList<Integer>(); // Não dá certo mas Integer, extends Number. Então pq não funciona?
List<? super Integer> lista = new ArrayList<Integer>();// Esta linha funciona normalmente. Alguém pode explica-la?
Exemplo completo:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Collections {
public static void main(String[] args) {
//List lista = new ArrayList();
//List<? extends Object> lista = new ArrayList<Integer>();
//List<Integer> lista = new ArrayList<Integer>();
//ArrayList<Number> lista = new ArrayList<Integer>();
//ArrayList<? extends Number> lista = new ArrayList<Integer>();
List<? super Integer> lista = new ArrayList<Integer>();
//List<Integer> lista = new List<Integer>();// instanciando uma interface
//<Integer> lista = new LinkedList<Integer>();
lista.add(2);
}
}
Obrigado. Generics tem sido um problema para mim. Quem puder ajudar também te uma dúvida em :
http://www.guj.com.br/posts/list/93342.java
Obrigado! :thumbup:
Usa-se a linguagem de Generics na assinatura dos métodos, não na sua implementação.
Não entendi.
Agora olhem :
:arrow: Esta linha compila normalmente:
Set <? extends Float> s = new TreeSet<Float>();
:arrow: Essa da erro de compilação
List<? extends Object> lista = new ArrayList<Integer>();
:arrow: :arrow: Por que :?:
Ola,
Vamos por parte,
List<? extends Object> lista = new ArrayList<Integer>();
Primeiro essa aqui nao da erro, pois a palavra reservada extends define tudo que esta a abaixo na sua arvore de herança, inclusive a propria classe.
ArrayList<Number> lista = new ArrayList<Integer>()
Em generics, nao existe polimorfismo.
List<? super Integer> lista = new ArrayList<Integer>()
E isso funciona, pq a palavra reservada super define tudo que esta a acima na sua arvore de herança, inclusive a propria classe.
[]'s
Obrigado :thumbup:
Agora falta pouco :lol:
Recapitulando:
List lista = new ArrayList(); // Compila normalmente
List<? extends Object> lista = new ArrayList<Integer>();// A linhha compila. Mas levanta a questão abaixo
List<Integer> lista = new ArrayList<Integer>(); // Compila normalmente
ArrayList<Number> lista = new ArrayList<Integer>(); // Não compila. Polimorfismo não funciona com Generics.
ArrayList<? extends Number> lista = new ArrayList<Integer>(); // A linhha compila. Mas levanta a questão abaixo
List<? super Integer> lista = new ArrayList<Integer>(); // Compila normalmente
List<Integer> lista = new List<Integer>(); // Não Compila. Está instanciando uma interface.
List lista = new LinkedList<Integer>(); // Compila normalmente
List <Integer> lista = new LinkedList<Integer>(); // Compila normalmente
Sendo que :

imagem maldita !!! Se não tiver aparecendo veja pelo caminho :
Então :
ArrayList<? extends Number> lista = new ArrayList<Integer>();
//ArrayList<? extends Object> lista = new ArrayList<Integer>(); //Compila normalmente
//ArrayList<? extends Object> lista = new ArrayList<Number>(); //Compila normalmente
//ArrayList<? extends Number> lista = new ArrayList<Object>(); //Essa linha dá pau devido o motivo abaixo
/*
A palavra reservada extends define tudo que esta a abaixo na sua
arvore de herança, inclusive a propria classe.
*/
List<? super Number > liste = new ArrayList<Object>();
// List<? super Number> liste = new ArrayList<Integer>();//Essa linha dá pau devido o motivo abaixo
/*
A palavra reservada super define tudo que esta a acima na sua
arvore de herança, inclusive a propria classe.
*/
Object o = new Object();
Integer i = new Integer(2);
int in = 5;
liste.add(i); // ok
lista.add(i); // Não funciona. PQ ?
// liste.add(o); // Não funciona. PQ ?
Para concluir meu entendimento, por qual motivo as duas ultimas linhas(23,24) do código abaixo não compilam ?
Obrigado novamente. :thumbup: