Instanciando tipo Generic passando Class como parâmetro

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…

[quote=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…
[/quote]

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

É 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.

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…

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

[quote=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[/quote]
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…

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…

Teria um exemplo simples de como fazer isto?

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