2014-02-25 83 views
0

我試圖通過解析一個xml文檔來查找值來以編程方式設置Field的值。作爲對象類型返回一個枚舉

我的結構有些像這樣:

value = parseXml(); 
field.set(myObject, value); 

private Object parseXml() 
{ 
    String value = getValueFromXmlNode(); 
    if (type.isInstance(Enum.class)) 
    { 
    return Enum.valueOf(((Class<Enum>) type), value); 
    } 
    else 
    { 
    return value; 
    } 
} 

也能正常工作在大多數情況下。但是,如果該字段預計爲Enum,則不再有效。因爲我將我的方法的返回類型設置爲Object,所以枚舉被轉換爲字符串。然後field.set()調用失敗。

讓方法返回一個泛型可能是Enum的正確方法是什麼?

使用原始類型有對象包裝,autobox和unbox,有Enum有類似的東西嗎?

+0

請更多代碼;例如,你使用什麼XML API? – fge

+0

爲什麼我使用的是XML API?這是一個設計問題。我遺漏代碼的原因是因爲它的長度爲300行。我會填寫更多相關信息。 –

+1

好吧,並不是所有的XML API都以相同的方式反序列化,這似乎是一個反序列化問題 – fge

回答

3

因爲我將我的方法的返回類型設置爲Object,所以枚舉被轉換爲String。

不,它不。

使用原始類型有對象包裝autobox和unbox,是否有類似的東西?

枚舉值對象。您可以將枚舉值放入對象變量中。

我相信問題是這一行:

if (type.isInstance(Enum.class)) 

這應該是:

if (type.isEnum()) 

isInstance調用不會做你想做的,因爲它是詢問是否Class對象Enum.classinstanceoftype類。

然後,因爲該if檢查不起作用,它總是選擇第二個分支,原樣返回String value,這就是爲什麼它看起來像枚舉本身被轉換爲一個字符串。

+0

啊有趣。我一定誤解了isInstance()運算符。同樣,如何檢查類型是List?我沒有看到type.isList()方法。 'List.class.isAssignableFrom(類型)'? –

+2

是的,'isAssignableFrom()'。如果你有一個'class X implements List',那麼'List.class.isAssignableFrom(X.class)'是真的。 – Boann

+0

matchedField.getType()=>(java.lang.Class)int。 Integer.class.isAssignableFrom(matchedField.getType()); =>(boolean)false 如何使Integer.class.isAssignableFrom(int)爲false? –

-1

爲什麼使用Enum.valueOf(Class, String)而不是Enum.valueOf(String)?你知道定義Enum的String的值。

嘗試使用Enum.valueOf(value)來代替。

從Enum.valueOf(類,字符串)的的Javadoc:「請注意,對於特定的枚舉類型T,隱式聲明可以替代地使用這種方法對該枚舉公共靜態Ť的valueOf(String)方法來映射從名稱到相應的枚舉常量「。

+0

如果您有對特定枚舉類的編譯時引用,則只能使用'someEnumClass.valueOf(String)'。在這種情況下,'type'是一個變量。這就是'Enum.valueOf(Class,String)'的意思。 – Boann

+0

因爲他不提前知道枚舉類型。編輯:Boann先說。 – immibis