public abstract class Foo<T extends Foo<T>> // see ColinD's comment
{
public T eat(String eatCake)
{
return (T)this;
}
}
public class CakeEater extends Foo<CakeEater>
{
public void f(){}
}
Редактировать
Нет проблем требовать, чтобы подкласс вел себя определенным образом, который находится за пределами того, что может проверять статическая типизация. Мы делаем это все время - страницы и страницы простым английским языком, чтобы указать, как вы пишете подкласс.
Другое предлагаемое решение с ковариантным типом возвращаемого значения должно делать то же самое - запрашивать у реализаторов подкласса на простом английском языке тип this
. Это требование нельзя определить статической типизацией.