特定のサブクラスをパラメーターとして指定するインターフェースを実装するクラスが必要です。
public abstract Task implements TaskStatus<Task> {
TaskStatus<T> listener;
protected complete() {
// ugly, unsafe cast
callback.complete((T) this);
}
}
public interface TaskStatus<T> {
public void complete(T task);
}
しかし、単に task または の代わりに、使用される type-arg が、これを拡張する特定のクラスのものであることを保証したいと思います。
だから私が思いついた最高のものは次のとおりです。
public abstract Task<T extends Task> implements TaskStatus<T> {
}
次のように記述して拡張します。
public class MyTask extends Task<MyTask> {
}
しかし、これも有効です:
public class MyTask extends Task<SomeOtherTask> {
}
また、コールバックの呼び出しは ClassCastException で失敗します。それで、このアプローチは間違っていて壊れているのでしょうか、それとも私が見逃した正しい方法はありますか?