Enum.valueOf

Tenho alguns enums em um projeto (java 6), algo como:

enum Regiao {
RCN, RCS, SUD, SUL;
}

FazendoEnum.valueOf(Regiao.class, "RCS");, recupero a constante sem problemas.

Entretanto, estou tentando criar um método dinâmico onde passo o nome, ou mesmo a classe do Enum em tempo de execução. Fiz: Enum.valueOf(Class.forName("domain.Regiao"), "RCS"); // ou mesmo Enum.valueOf(Class c, String valor); e nem mesmo compila. Parece que falta algum cast, o Eclipse informa[quote]Bound mismatch: The generic method valueOf(Class<T>, String) of type Enum<E> is not
applicable for the arguments (Class<capture#6-of ?>, String). The inferred type capture#6-of ? is
not a valid substitute for the bounded parameter <T extends Enum><T>>[/quote]

Alguém já implementou algo do tipo?

Faz assim:

[code]      Class enumClass = Class.forName("domain.Regiao");
	Enum  enumTest =  Enum.valueOf(enumClass, "RCS");[/code]


Alysson Bandeira

enum Alunos {
    JOAO, PEDRO, LUCAS
}

enum Alunas {
    MARCIA, REGINA, LUISA
}

class TesteEnum3 {
    public static void main(String[] args) throws ClassNotFoundException {
        // Isto funciona OK...
        Enum en1 = Enum.valueOf (Alunos.class, "JOAO");
        System.out.println (en1); // imprime JOAO
        // e isto também funciona OK (provavelmente é o que você vai ter de usar), embora
        // tenha um "SuppressWarnings" meio chato:
        Class klass2 = Class.forName ("Alunos");
        @SuppressWarnings ("unchecked") Enum en2 = Enum.valueOf (klass2, "PEDRO");
        System.out.println (en2); // imprime PEDRO
        // O que vem a seguir requer, de qualquer maneira, a importação 
        // da classe Alunos, portanto não é bem o que você quer:
        Class&lt;Alunas&gt; klass3 = Alunas.class; // veja a declaração
        Alunas al3 = Enum.valueOf (klass3, "MARCIA");
        System.out.println (al3); // imprime MARCIA
        // Se em vez de Alunas.class tivéssemos Class.forName ("Alunas") 
        // o caso é um pouco pior, já que temos de 
        @SuppressWarnings ("unchecked") Class&lt;Alunas&gt; klass4 = 
            (Class&lt;Alunas&gt;) Class.forName ("Alunas");
        Alunas al4 = Enum.valueOf (klass4, "REGINA");
        System.out.println (al4); // imprime REGINA
        // Note que o "SuppressWarnings" deve ser usado apenas quando se sabe
        // o que está fazendo. Vamos fazer um cast errado de propósito:
        @SuppressWarnings ("unchecked") Class&lt;Alunas&gt; klass5 = 
            (Class&lt;Alunas&gt;) Class.forName ("Alunos"); // O compilador deixa passar...
        // A linha a seguir provoca, em tempo de execução, um 
        // IllegalArgumentException ("No enum const class Alunos.LUISA")
        Alunas al5 = Enum.valueOf (klass5, "LUISA");
        System.out.println (al5); 
    }
}

Alguem utiliza enums como se fossem (arg!) Singletons?