Я хочу иметь класс, который реализует интерфейс, который указывает конкретный подкласс в качестве параметра.
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);
}
Но вместо того, чтобы задавать или, я хочу гарантировать, что используемый тип аргумент - это класс определенного класса, расширяющего этот класс.
Итак, лучшее, что я придумал, это:
public abstract Task<T extends Task> implements TaskStatus<T> {
}
Вы бы расширили это, написав:
public class MyTask extends Task<MyTask> {
}
Но это также будет справедливо:
public class MyTask extends Task<SomeOtherTask> {
}
И вызов обратного вызова будет взорван ClassCastException. Итак, этот подход просто ошибочен и сломан, или есть верный способ сделать это, я как-то упустил?