[code] public class TesteGenerics {
private <E> E getValue() {
return null;
}
public static void main(String[] args) {
TesteGenerics g = new TesteGenerics();
List l = g.getValue();
Object o = g.getValue();
String s = g.getValue();
int i = g.getValue();
}
O que o tutorial de Generics vai lhe dizer é que você tem de fazer algo semelhante a:
import java.util.*;
class TesteGenerics {
private <E> E getValue (Class<E> klass) {
try {
return klass.newInstance();
} catch (Exception ex) { // ok, é uma outra exceção que newInstance lança, mas tenho de ver na documentação
return null;
}
}
@SuppressWarnings ("unchecked")
public static void main(String[] args) {
TesteGenerics tg = new TesteGenerics();
String s = tg.getValue (String.class);
List<String> ls = (List<String>) tg.getValue(ArrayList.class); // isto gera um warning
Number n = tg.getValue (Double.class);
Integer i = tg.getValue (Integer.class);
System.out.printf ("[%s] [%s] [%d] [%d] %n", s, ls.toString(), n, i);
}
}
É claro que tem (crie um new java.lang.Throwable(), e use o método getStackTrace()), mas isso é realmente nojento - você precisaria:
Obter o número da linha e o nome da classe (isso é fácil);
Deixar o fonte disponível para você acessar em tempo de execução (argh);
Efetuar um “parse” nessa linha; (argh argh argh - você conhece teoria de compiladores?)
Você realmente quer fazer isso?
O sr. Gilad Bracha (um dos inventores e implementadores de Generics em Java) disse que não é para fazer isso que você quer fazer.
Ele disse no tutorial dele que, de preferência, se você realmente precisar disso, passar um objeto da classe java.lang.Class, tal como eu mostrei.
Complementando… pelo que eu entendo, generics não é pra isso mesmo, não é pra fazer… afinal, você não está sendo “Generic”, certo? veja se não é o caso de trabalhar com interfaces, por exemplo…