Instanciando tipo Generic passando Class como parâmetro

8 respostas
E

Olá a todos…
Sabendo que generics só existem em tempo de compilação e não em runtime, é viável instanciar uma classe genérica passando um parâmetro Class? (pois precisarei dele para recuperar o nome da classe mas também precisarei do Generic)
algo como:

GenericBeanService<Cliente> clienteService = new GenericBeanServiceImpl<Cliente>(Cliente.class);

Eu teria como fugir desse instanciamento, digamos, ?repetitivo??
Obrigado pela atenção…

8 Respostas

A

erico_kl:
Olá a todos…
Sabendo que generics só existem em tempo de compilação e não em runtime, é viável instanciar uma classe genérica passando um parâmetro Class? (pois precisarei dele para recuperar o nome da classe mas também precisarei do Generic)
algo como:

GenericBeanService<Cliente> clienteService = new GenericBeanServiceImpl<Cliente>(Cliente.class);

Eu teria como fugir desse instanciamento, digamos, ?repetitivo??
Obrigado pela atenção…

Olhe… isso de “generics só existem em tempo de compilação e não em runtime” não é 100% verdade. É fato que, de maneiras convencionais, os generics não estão lá, de fato, mas a informação continua por aí.

Dê uma olhada: http://www.altuure.com/2010/08/31/how-to-get-generic-metadata-from-a-class-at-runtime/

Só lembrando que esse tipo de método, de fato, não é 100% confiável, então, tome o cuidado de ter um “backup” do método (por exemplo, colocar o seu método de recuperação da classe em um método que seja acessível por uma subclasse).

[]´s

V

É possível instanciar sim. Até pq com o class, você pode fazer uma chamada a getConstructor, e criar o objeto por reflexão.

Mas isso também significaria que seu bean precisa ter um construtor padrão ou, pelo menos, conhecido.

E

primeiro obrigado pela resposta…
quando me referi ao “generics só existem em tempo de compilação” seria fazendo uma visão mais ampla, pois nao posso obter a classe ou invocar um método de um tipo genérico de forma direta… Seria o mesmo que dizer “java não tem herança múltipla” que também pode ser interpretada de formas diferentes em uma visão mais ampla ou mais baixo nível
minha dúvida é se posso instanciar esse tipo Generic passando a classe do tipo por parâmetro ou teria uma forma mais prática…

Obs.: não tem nenhum problema com a classe ou com a interface em que ela está instanciada, está rodando normalmente… só gostaria de ver se essa implementação é viável…

A

O que eu quis dizer foi:

Sim, você pode instanciar um objeto a partir da classe que o define.

Não, você não precisa ser repetitivo. Se você instanciar a classe passando um genérico (tomando o cuidado de garantir que um tipo genérico sempre está sendo passado), você não precisa passar a classe como parâmetro.

[]´s

E

asaudate:
O que eu quis dizer foi:

Sim, você pode instanciar um objeto a partir da classe que o define.

Não, você não precisa ser repetitivo. Se você instanciar a classe passando um genérico (tomando o cuidado de garantir que um tipo genérico sempre está sendo passado), você não precisa passar a classe como parâmetro.

[]´s


certo… obrigado…
mas na verdade nao preciso instanciar esse tipo genérico, preciso somente recuperá-lo como Class para obter o nome da classe para aí sim instanciar outra com nome parecido (mas isso já está implementado)… talvez seja algo simples que eu nao esteja percebendo como fazer…

E

Ou seja… em outras palavras o que eu quero é recuperar um getClass do generic…

T.class;

pois se não tiver como, terei que passar o Class do meu bean por parâmetro mesmo…

D

Teria um exemplo simples de como fazer isto?

F

Encontrei um metodo relativamente simples para isso:

class Foo<T> {
    
    // aqui voce ja tem o "T.class" que voce pode usar para instanciar um objeto com reflections
    private Class<T> typeParameterClass;

    public Foo() {
         Type x = ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

         System.out.println("class name: "+x.toString().split(" ")[1]); 
    }
}

fonte: http://stackoverflow.com/questions/3437897/how-to-get-class-instance-of-generics-type-t

Criado 9 de novembro de 2010
Ultima resposta 17 de nov. de 2014
Respostas 8
Participantes 5