Instanciando tipo Generic passando Class como parâmetro
8 respostas
E
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:
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:
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í.
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
ViniGodoy
É 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
erico_kl
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
Alexandre_Saudate
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
erico_kl
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
erico_kl
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
Diabo_Loiro
Teria um exemplo simples de como fazer isto?
F
fabioboh10
Encontrei um metodo relativamente simples para isso:
classFoo<T>{// aqui voce ja tem o "T.class" que voce pode usar para instanciar um objeto com reflectionsprivateClass<T>typeParameterClass;publicFoo(){Typex=((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];System.out.println("class name: "+x.toString().split(" ")[1]);}}