私は長い間 Java でイディオムを使用して、(非抽象) クラスのクラス情報をその (一般に抽象) 祖先クラスのメソッドで使用してきました (残念ながら、このパターンの名前が見つかりません)。
public abstract class Abstract<T extends Abstract<T>> {
private final Class<T> subClass;
protected Abstract(Class<T> subClass) {
this.subClass = subClass;
}
protected T getSomethingElseWithSameType() {
....
}
}
そのサブクラスの例:
public class NonGeneric extends Abstract<NonGeneric> {
public NonGeneric() {
super(NonGeneric.class);
}
}
Abstract
ただし、独自の汎用パラメーターを持つサブクラスを定義するのに問題があります。
public class Generic<T> extends Abstract<Generic<T>> {
public Generic() {
super(Generic.class);
}
}
この例はコンパイルできません。同様に、 eg を使用してジェネリック型を指定することGeneric<T>.class
も、 のようなワイルドカードを使用することもできませんGeneric<?>
。
T
また、スーパークラスのジェネリック型の宣言を に置き換えてみました? extends T
が、それもコンパイルできません。
このパターンをジェネリック基本クラスで動作させる方法はありますか?