考虑以下函数:
public static <T> T doSomething(Document doc, String xpath, Class<T> returnType);
这个想法是处理 XML 文档,在指定的 xpath 检索对象,并返回指定类型的东西,足够简单。现在,假设我们想让它 if returnType.isEnum()
,我们想把它当作我们想要检索 aString
而不是 enum 类型,然后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>>
. 但是,您不能通过任何returnType
一种方式真正塑造成那样Class.asSubclass()
(至少没有不安全的铸造,我们试图避免这种情况)。
看起来你不能超载doSomething()
来做一些特定于枚举的事情——即。
public static <T extends Enum<T>> T doSomething(Document doc, String xpath, Class<T> returnType);
因为这实际上是运行时的“相同签名”。
所以,问题是,有没有办法在一个方法中安全地完成所有这些,或者我需要一个单独的方法来专门处理枚举或诉诸不安全的演员表?