Genéricos - Por que o código não Compila?

12 respostas
VantuilJose
public class TelaPesquisa extends javax.swing.JDialog {
    List<? extends EntidadeSimples> lista;
    /** Creates new form TelaPesquisa */
    public TelaPesquisa(java.awt.Frame parent, boolean modal, List<? extends EntidadeSimples> lista) {
        super(parent, modal);
        initComponents();
        this.lista = lista;
    }

    public List<? extends EntidadeSimples> pesquisaLista(){
        List<? extends EntidadeSimples> listaRef = null;
        for (EntidadeSimples e : lista){
            if (e.getNome().toUpperCase().contains(txtChavePesquisa.getText()) || ("" + e.getCodigo()).toUpperCase().contains(txtChavePesquisa.getText()) ){
                listaRef.add(e);//O problema é nessa linha
            }
        }
        return listaRef;
    }

}

Por que o código listaRef.add(e) não compila? Ele naum deveria aceita EntidadeSimples e qualque subtipo? :?:

12 Respostas

thiago.correa

Qual é o erro que está dando?!

ViniGodoy

Declare apenas como:

List<EntidadeSimples>

Wildcards geralmente só serão usados para aceitar parâmetros de métodos. Muito raramente como propriedades ou valores de retorno.

VantuilJose

Esse aqui:

symbol : method add(entidades.EntidadeSimples) location: interface java.util.List<capture#399 of ? extends entidades.EntidadeSimples> listaRef.add(e); 1 error

:shock:

V

O problema esta aqui

List<? extends EntidadeSimples> listaRef = null;  //erro - vc esta tantando incluir em uma lista null

//correcao
List<? extends EntidadeSimples> listaRef = new ArrayList<? extends EntidadeSimples>();
VantuilJose

ViniGodoy, utilizando um List eu poderei passar no meu construtor listas de qualquer subtipo de EntidadeSimples?

ViniGodoy

Você precisa estudar mais sobre wildcards e quando usa-los. Esse, definitivamente, não é o caso.

VantuilJose

vdb, eu realmente estou tentando inserir em uma lista vazia, mas isso geraria um erro de execução, e o que eu tenho é um erro de compilação, não resolvi eu fazer isso aqui: List<? extends EntidadeSimples> listaRef = new ArrayList<EntidadeSimples>(); :frowning:

VantuilJose

Pois é testei aqui!!!
Vou deixar de ser preguiçoso e ler o tutorial da sun sobre generics!!!
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Existe algum bom material que você possa me indicar?

Felagund

Qual vc passa como parametro uma lista de subtipos de EntidadeSimples, Vc sempre tera objetos do tipo EntidadeSimples.

Um retorno de EntidadeSimples é valido

ViniGodoy

Faz assim:

List<EntidadeSimples> listaRef = new ArrayList<EntidadeSimples>();

Simples assim, sem nenhum “?”.

Essa lista aceita que sejam inseridas filhas de EntidadeSimples em seu interior.

Os wildcards vc usa em parâmetros, quando quer dizer:

“Preciso de um método que aceite um List de EntidadeSimples ou um List de seus Filhos”.

Ou seja, se EntidadeSimples tiver como filhos PessoaFisica e PessoaJuridica, vc usa o WildCards para dizer que quer um
List<EntidadeSimples> ou um List<PessoaFisica> ou um List<PessoaJuridica>.

No que o WildCard indica que o tipo da lista muda, não do seu conteúdo. Um List<EntidadeSimples> vai admitir os três tipos de dado em seu interior.

O problema é que um List<PessoaFisica> não é implicitamente convertível para um List<EntidadeSimples>. Isso pq isso permitira inserir uma pessoa Jurídica na nova lista. Por isso, o método add fica barrado quando existem wildcards. Você só pode usar os métodos que leem da lista, pois, independente do tipo da lista, todos os objetos serão convertíveis para EntidadeSimples.

Um exemplo de método onde o Wildcard se encaixaria seria o de relatório:

public void imprimirEntidadesSimples(List<? extends EntidadeSimples> entidades) { for (EntidadeSimples es : lista) { imprimir(es); } }

Isso permitiria passar para a função um List.

VantuilJose

Valeu ViniGodoy!!!
Agora deu pra entender direitinho :smiley:

Deu pra entender que, tipo, se eu passo uma lista de PessoaJurídcia e depois tento adicionar uma entidadeSimples nela, quando chamar algum método de EntidadeSimples em PessoaJuridica, é claro que vai ter um erro!!!

A solução era muito mais simples do que imaginei!!! Mas ainda deu pra aprender um pouco mais!!!

Obrigado!!! :smiley:

welitonjose

pq e um lixo

Criado 15 de janeiro de 2010
Ultima resposta 18 de jan. de 2010
Respostas 12
Participantes 6