Problema com Generics

Quero fazer o seguinte com Generics:

Retornar uma lista com o tipo do bean que eu passar para o método.


public <E> List<E> getList(E bean) {

}

O único jeito que eu encontrei de fazer isso me dá um warning dizendo que não é o jeito certo de se fazer (Type safety: The cast from capture-of ? extends Object to E is actually checking against the
erased type Object
)

E bean = (E) bean.getClass().newInstance();

Alguém sabe como fazer isso ou se é possível fazer isso de um mode diferente a esse que eu fiz aí ???

public <E> List<E> getList (Class<E> klass, E bean) {
    E x = klass.newInstance();
}

Uso:

MeuBean bean = ...;
List<MeuBean> meusBeans = getList (MeuBean.class, bean);

Se seu “bean” serve apenas para se determinar o tipo, então use:

public <E> List<E> getList (Class<E> klass) {
   E x = klass.newInstance();
}
List<MeuBean> meusBeans = getList (MeuBean.class);

Não !!! O problema é que meu bean não serve apenas para determinar o tipo. Ele tem outras coisas importantes.

A questão então ficou simples:

É possível pegar a class E do meu bean para instanciar outro ou isso é impossível, ou seja, eu obrigatoriamente além do bean tenho que passar a classe dele.

Muito esquisito se isso for impossível…

Hum, agora entendi.

Vou preparar um exemplo aqui, para ver o que você precisa.

Um outro problema de ter que obrigatoriamente passar o bean e a classe é que o cara pode malandramente passar o bean e uma classe nada haver…

Daí vai dar pau… (nada muito grave, mas o melhor seria passar apenas o bean para evitar esse problema…)

Não, não pode. Isso não compila.

[quote=mister__m][quote=saoj]
Um outro problema de ter que obrigatoriamente passar o bean e a classe é que o cara pode malandramente passar o bean e uma classe nada haver…
[/quote]

Não, não pode. Isso não compila.[/quote]

Perdão! Tem razão… Ambos tem que ser E… :slight_smile:

import java.util.*;

class BeanPadrao {
}

class MeuBean extends BeanPadrao {
}

class SeuBean extends MeuBean {
}

class OutroBean extends BeanPadrao {
}

/**
 * Para simplificar, estou desprezando o tratamento de exceptions
 */
class BeanBean {
    
    // Primeira opção - warning: [unchecked] unchecked cast
    // found   : capture#98 of ? extends java.lang.Object
    // required: E
    public <E> List<E> getList1a(E bean) throws Exception {
        List<E> ret = new ArrayList<E>();
        E newBean = (E) bean.getClass().newInstance();
        ret.add (newBean);
        return ret;
    }
    // Note que isto não faz exatamente o que você quer,
    // mas não provoca warnings
    public <E> List<E> getList1b(E bean, Class<E> klass) throws Exception {
        List<E> ret = new ArrayList<E>();
        E newBean = klass.newInstance();
        ret.add (newBean);
        return ret;
    }
    // Será que é isso que você precisa?
    public List<BeanPadrao> getList2 (BeanPadrao bean) throws Exception {
        // Note que um ArrayList<BeanPadrao> pode conter, entre outras
        // coisas, MeuBean e SeuBean, assim como OutroBean.
        List<BeanPadrao> ret = new ArrayList<BeanPadrao>();
        // Note que aqui iremos criar um "newBean" cuja classe é 
        // "MeuBean" se bean.getClass() == MeuBean.class, por exemplo.
        BeanPadrao newBean = bean.getClass().newInstance();
        ret.add (newBean);
        return ret;
    }
    
    
    public static void main(String[] args) throws Exception {
        BeanBean bb = new BeanBean();
        MeuBean b1 = new SeuBean();
        BeanPadrao b4 = new OutroBean();
        List<MeuBean> lsb1a = bb.getList1a (b1); 
        List<MeuBean> lsb1b = bb.getList1b (b1, MeuBean.class); 
        List&lt? extends BeanPadrao&gt lsb2 = bb.getList2 (b1); 
        List<BeanPadrao> lsb4 = bb.getList2 (b4);
    }
}

A terceira opção seria como vc assumir que BeanPadrao é o Object, mas aí vc teria que dar cast nos elementos da sua Lista para o bean em questão.

Acho que eu vou viver com o warning lá…

Mas valeu thingol!!!