Duvida com Generics

[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();
}

}[/code]

Como eu posso dar um E.class no metodo getValue?

VELO

Não tem como.

Poh, como tem… a questão é o trampo q vai dar.

VELO

Eu só não entendi uma coisa… oque essa classe faz afinal?!

Ainda não faz nada…

Ela vai fica ± assim:

if(String.class.equals(E.class)){
   doA();
}
if(List.class.equals(E.class)){
   doB();
}

coisas assim…

VELO

Então cara… eu não queria te dar uma má noticia… mas num dá pra fazer do jeito que você quer…

prq vc nao usa instanceof?

Esse monte de if…

Não daria para usar polimorfismo e substituir por um enum, implementando o Pattern Strategy?

[quote=ViniGodoy]Esse monte de if…

Não daria para usar polimorfismo e substituir por um enum, implementando o Pattern Strategy? [/quote]

Dar, dah… mas daih ele tem q passar como parametro no metodo neh?!

Se fosse pra fazer assim eu passava o class, hehehe

VELO

nao tem como fazer velo.

E se eu ler a linha anterior do stack?!

Toh pensando em fazer isso…

VELO

O que o tutorial de Generics vai lhe dizer é que você tem de fazer algo semelhante a:

import java.util.*;

class TesteGenerics {
    private &lt;E&gt; E getValue (Class&lt;E&gt; 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&lt;String&gt; ls = (List&lt;String&gt;) 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);
    }
}

Eh, eu tava pensando nisso tbm, e nem precisava do newInstance…

Me diz uma coisa… não tem como eu ler o stack do q tah rolando no java, pegar a linha que tá chamando o getValue e fazer isso?

VELO

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

Nao tem como fazer isso Velo… :cry:

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…

Abraço,

Armando