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
Vous devez vous connecter pour publier un commentaire.
Modifier
Il n'y a pas de problème pour exiger la sous-classe se comporter d'une certaine manière au-delà de ce que le typage statique pouvez vérifier. Nous le faisons tout le temps - des pages et des pages de la plaine de l'anglais pour spécifier la façon dont vous écrivez une sous-classe.
L'autre solution proposée, avec covariante type de retour, doit faire de même, en demandant à la sous-classe des exécutants, en clair, de retourner le type de
this
. Cette exigence ne peut pas être spécifié par le typage statique.L'approche de bon goût de la part du client du point de vue (ce qui est généralement celui que vous voulez prendre est d'utiliser le covariante des types de retour qui a été ajouté pour prendre en charge les génériques, comme Michael Barker.
Le un peu moins bon goût, mais plus de goût qu'un casting est d'ajouter un
getThis
méthode:Je ne pense pas que vous avez besoin de médicaments génériques de Java 5 (et plus tard) a covariante des types de retour, par exemple:
Une approche que j'ai utilisé avant d'obtenir le même comportement est la sous-classe passe son type dans un constructeur de l' (generified) type parent. Par la voie de l'avertissement, j'ai été la génération de la sous-classes à la volée et l'héritage a un peu de triche pour garder ma génération de code simple, comme toujours, mon premier réflexe est d'essayer de supprimer l'étend relation tout à fait.