引数の1つとしてクラスオブジェクトを必要とする別のメソッドを呼び出すメソッドを持つジェネリッククラスがあります。オブジェクト作成時にジェネリックとして設定されているクラス型を使用できるようにしたいのですが、構文が正しくないようです。これが私がやりたいことです:
public abstract class GenericClass<T> {
private void doStuff() {
//do a bunch of stuff
//This method's signature is methodToCall(Serializable s) and is not a method I can change
methodToCall(T);
methodToCall(Class<T>);
methodToCall(T.class);
//do some more stuff
}
}
public class NonGenericClass extends GenericClass<DesiredClass> {
}
Classオブジェクトタイプはシリアル化できるため、これは機能します。
methodToCall(DesiredClass.class);
しかし、メソッドの途中でクラス型が必要になるため、すべてのコードをコピーしてしまうため、メソッドを簡単にオーバーライドすることはできません。
これが私がこれまでに思いついた最高のものです:
public abstract class GenericClass<T> {
protected abstract void doStuff();
protected <T> void doStuff(Class<T> cls) {
methodToCall(cls);
}
}
public class NonGenericClass extends GenericClass<DesiredClass> {
@Override
protected void doStuff() {
doStuff(DesiredClass.class);
}
}
それは機能しますが、ジェネリッククラスはTが何であるかについての知識を無駄にしているように感じます。methodToCall
最初にリストした3つのバージョンの呼び出しに構文エラーがありますか?これはどうしてもできないことですか?
これがすべて理にかなっていることを願っています。