2014-01-31 153 views
1

我有一個相當簡單的問題。
我有一個java.lang.reflect.Type類型的變量,我想對它做兩件不同的事情,以防它保留類或枚舉。我可以簡單地通過簡單地詢問.isEnum()來檢查變量是否爲enum。然而,爲了調用特定的枚舉方法,我需要將這個變量賦值爲枚舉。這裏有一些用於說明的代碼。我知道這不會使SENCE的多,但它只是投插圖:如何將java.lang.reflect.Type轉換爲枚舉?

public class TestClass { 
    public static String text = "MySampleTextClass."; 
} 
public enum TestEnum { 
    MySampleText 
} 
public class Tester { 
    public static Object retrieveValue (java.lang.reflect.Type myVar, String enumStringValue) { 
     String enumStringValue = "MySampleText"; 

     // the variable is enum!!! 
     if (myVar.isEnum()) { 
      return (Enum myVar).valueOf(enumStringValue); 
     } 
     // the variable is class!!! 
     else { 
      return myVar.getClass().getSimpleName(); 
     } 
    } 
} 

我試着像

(java.lang.Enum myVar).valueOf(enumString); 

(java.lang.Enum<?> myVar).valueOf(enumString); 

石膏,但我不能讓它起作用。

任何想法?

+1

'Type'沒有'isEnum'方法。使用'Class'不是更簡單嗎? – Pshemo

回答

2

使用靜態方法valueOf是在抽象類Enum聲明:

Class clazz = (Class) myVar; 
if (clazz.isEnum()) { 
    return Enum.valueOf(clazz, enumStringValue); 
} 

但是...強制轉換爲類是必要的,因爲java.lang.reflect.Type只是一個標記接口。此外,您必須轉換爲原始類型類才能使其工作。有很多運行時陷阱可以進入。

總的來說,有這樣一個要求是非常不尋常的。爲什麼你必須使用反射來檢索一個你甚至不知道類型的枚舉值?

+0

在投射之前,你真的應該使用'instanceof'來檢查它是否是'Class'對象。 – Powerlord

+0

@Powerlord我認爲一般在使用Reflection時,最好在''instance''上使用'Class.isInstance(object)'。 – asteri

+0

@Powerlord:是的,你是對的。但這不是這個代碼片段的唯一問題。我不想讓它進一步複雜化。 – Seelenvirtuose