Renvoyer une sous-classe d'objets avec des génériques

Avec une classe abstraite, je veux définir une méthode qui retourne "ce" pour les sous-classes:

public abstract class Foo {
    ...
    public <T extends Foo> T eat(String eatCake) {
        ...
        return this;
    }
}  

public class CakeEater extends Foo {}

Je veux être capable de faire des choses comme:

CakeEater phil = new CakeEater();
phil.eat("wacky cake").eat("chocolate cake").eat("banana bread");

Sans doute pain à la banane lancerait une IllegalArgumentException avec le message "Pas un gâteau!"

source d'informationauteur Sarabjot