次の関数を検討してください。
public static <T> T doSomething(Document doc, String xpath, Class<T> returnType);
アイデアは、XML ドキュメントを処理し、指定された xpath でオブジェクトを取得し、指定された型の何かを返すという単純なものです。ここで、 if をenum 型ではなくreturnType.isEnum()
a を取得するかのように扱い、最後に使用するようにしたいとしましょう。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>>
。returnType
ただし、どちらの方法でも実際にそのように形作ることはできませんClass.asSubclass()
(少なくとも、回避しようとしている危険なキャストがなければ)。
また、doSomething()
列挙型固有のことを行うためにオーバーロードできないようです。
public static <T extends Enum<T>> T doSomething(Document doc, String xpath, Class<T> returnType);
これは文字通り「同じ署名」のランタイムであるためです。
したがって、問題は、これらすべてを 1 つのメソッドで安全に行う方法があるか、または列挙型を特別に処理したり、安全でないキャストに頼ったりする別のメソッドが必要かということです。