考慮以下功能:僞重載在Java中
public static <T> T doSomething(Document doc, String xpath, Class<T> returnType);
的想法是處理XML文檔,檢索在指定的XPath的對象,並返回指定類型的東西,很簡單。現在,我們假設我們要這樣做,以便如果returnType.isEnum()
,我們想把它看作是我們想要檢索String
而不是枚舉類型,然後最終使用Enum.valueOf()
。
不幸的是,它會出現
String returnedObj = String.class.cast(...); // Returned value from the actual XPath.evaluate() call
return Enum.valueOf(returnType, returnedObject);
不起作用,因爲returnType
不是Class<T extends Enum<T>>
。但是,您無法通過Class.asSubclass()
(至少沒有不安全的投射,我們試圖避免)塑造returnType
。
它似乎也不能超載doSomething()
爲了做一些枚舉特定的 - 即。
public static <T extends Enum<T>> T doSomething(Document doc, String xpath, Class<T> returnType);
因爲這實際上是「相同的簽名」運行時明智的。
因此,問題是,是否有辦法在一種方法中安全地完成所有這些操作,還是需要一種單獨的方法來專門處理枚舉或求助於不安全的投射?
度過一個不安全的表演。 Java不能證明它是安全的,但你可以。 –
@KelvinChung不要使用'String.class.cast'這是很難閱讀和完全不必要的。只需使用普通的演員表 – Jeffrey