これは、 Java Genericsを使用してやろうとしていることの単純化されたサンプルです。
void <T> recursiveMethod(T input) {
//do something with input treating it as type T
if (/*need to check if T has a supertype*/) {
recursiveMethod((/*need to get supertype of T*/) input);
// NOTE that I am trying to call recursiveMethod() with
// the input object cast as immediate supertype of T.
// I am not trying to call it with the class of its supertype.
// Some of you seem to not understand this distinction.
}
}
タイプA extends B extends C (extend Object)の長いチェーンがある場合、呼び出しrecursiveMethod(new A())
は次のように実行する必要があります。
recursiveMethod(A input)
-> A has supertype B
recursiveMethod(B input)
-> B has supertype C
recursiveMethod(C input)
-> C has supertype Object
recursiveMethod(Object input)
-> Object has no supertype -> STOP
次のようにジェネリックなしでそれを行うことができます:
void recursiveMethod(Object input) {
recursiveMethod(input.getClass(), input);
}
}
private void recursiveMethod(Class cls, Object input) {
//do something with input treating it as class 'cls'
if (cls != null) {
recursiveMethod(cls.getSuperclass(), input);
}
}
ジェネリックを使用して同じことを行うことはできますか? as として宣言してから as として<S, T extends S>
キャストしようとしまし(S)input
たS
が、常に等しいためT
、スタック オーバーフローが発生します。