"this very class"の型を参照する方法がないという問題があります。このため、abstract class Base<T extends Base<T>>
のような構文を使用する必要があります。しかし、多くの人がコメントで述べたように、Subclass1 extends <Subclass2>
を定義することを禁止するものはありません。 T
が "this very class"であることを保証する文法的な方法があります。
ただし、実行時にこの保証を適用することはできます。 TypeToolsなどの方法を使用して、使用されている汎用タイプを抽出し、現在のインスタンスにこのタイプがあることを確認できます。このクラスはインスタンス化することができる
public abstract class Base<T extends Base<T>> {
protected Base() {
final Class<?> t = (Class<?>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (!t.isInstance(this)) {
throw new IllegalArgumentException();
}
}
public T getInstance() {
@SuppressWarnings("unchecked")
T thisIsT = (T) this;
return thisIsT;
}
}
:これはおそらくのようなものになるでしょう
public class Extension1 extends Base<Extension1> {}
しかし、これではない:this
はT
のインスタンスであること
public class Extension2 extends Base<Extension1> {}
Base
コンストラクタ保証したがって、this
〜T
のキャストは安全です。
これを行うことにした場合、 'class ChildClass2 extends ParentClass'になります。 ここでは、達成したいこと、または達成したい理由について完全にはっきりしていません。それに応じてあなたの質問を更新したいのであれば、私は答えを出すことができるかもしれません。 –
@JoeC私はうまくいきましたが、親クラスの 'this'をTにキャストする必要があります。既に 'this'がTのインスタンスであることを知っているはずです。より洗練されたソリューションがあるかどうかは疑問でしたそれはちょうど思考するほどスマートではなかった。私がキャストする必要のないもの、またはジェネリックスをまったく使用せずに子供のインスタンスを返したもの。 –
私が提案したサブクラスで何を持っているのか試してみましょう。 –