Generics + Reflection

Olá a todos,

Em uma classe como a abaixo

[code]
public class Teste
{
public Class getRealGenericType()
{

}

}[/code]
e instanciada assim

Teste<String> t = new Teste<String>();

Há como escrever um método que retorne o tipo genérico passado na instanciação da classe (no caso acima, String)? A única coisa que consegui foi obter o valor T. Mas meu objetivo não é T, mas String. É possível obter ou isto não está disponível à reflexão?

creio q naum

não é possivel não…

Err… como nao?

	private Class getType(Method getter) {
		Type[] types = getter.getGenericParameterTypes();
		if ((types.length != 1) || (!(types[0] instanceof ParameterizedType))) {
			return null;
		}

		ParameterizedType type = (ParameterizedType) types[0];
		return (Class) type.getActualTypeArguments()[0];
	}

O codigo acima foi tirado de uma aplicacao minha, mas da para voce entender e adaptar para sua necessidade.

O Paulo Silveira fala sobre este assunto no seu post no blog da Caelum:

http://blog.caelum.com.br/2006/10/29/brincando-com-generics-o-bizarregenericdao/

[]s,
Sami

não é possivel saber o tipo passado para uma classe (ja perdi bastante tempo tentando descobrir como :frowning:

não da, essa informacao nao fica guardada em tempo de execucao. a nao ser que voce tenha uma filha que estende essa classe e explicita quem eh T.

Obrigado pelas respostas, pessoal! Como o Paulo Silveira disse, a solução enviada pelo Juzpeleteiro só encontra o tipo declarado em código (no caso do exemplo que enviei, T). É útil quando se declara explicitamente o tipo, como List teste.

É, vou ter mesmo que recorrer à boa e velha anotação. Obrigado a todos.

É isso aí, o Generics funciona muito bem, mais para tempo de compilação.

Ele não pode verificar este tipo de informação em tempo de execução, pois dessa forma você perderia a compatibilidade do Java 5 com as versões anteriores a implementação do Generics

Uma forma boba de conseguir isso é passar algum parâmetro que contenha um objeto do tipo Class.

Exemplo:

import java.util.*;

class MinhaLista&lt;T&gt; extends ArrayList&lt;T&gt; {
    private Class&lt;T&gt; klass;
    public MinhaLista(Class&lt;T&gt; klass) {
        super();
        this.klass = klass;
    }
    public Class&lt;T&gt; getElementClass() {
        return klass;
    }
    
    public static void main(String[] args) {
        
        List&lt;String&gt; lista = new MinhaLista&lt;String&gt;(String.class);
        lista.add (&quot;abacaxi&quot;);
        lista.add (&quot;banana&quot;);
        lista.add (&quot;caqui&quot;);
        // Suponha que você não saiba o tipo do elemento
        Class&lt?&gt klass = ((MinhaLista) lista).getElementClass();
        System.out.println (klass);
    }
}