J'essayais de trouver un moyen de créer une méthode interface/abstract avec la classe déclarative/d'extension en tant que type de retour. (par exemple, classA étend interfaceA, et la méthode devrait renvoyer un objet ClassA).Java - extension de la classe en tant que type de retour sur l'interface/méthode abstraite
Maintenant, j'ai trouvé un post que le compilateur ne se plaindrait pas de quelque chose comme ça, mais la JVM n'est pas capable de gérer une telle chose, ce qui signifie que ce mécanisme n'existe pas dans java.
Donc je suis venu avec l'idée suivante, à partir de laquelle je ne sais pas si c'est techniquement assez d'épargne pour faire. (par exemple va-t-il provoquer une boucle)
public interface ISomeInterface<T extends ISomeInterface<T>> {
public T get();
}
ce qui signifie que vous pouvez l'utiliser de cette manière. Bien que cela ne marche pas forcer un utilisateur externe à utiliser la classe d'extension, au moins donne l'occasion de le faire si préféré:
public class ExtendingClass implements ISomeInterface<ExtendingClass>{
@Override
public ExtendingClass get(){}
}
Maintenant, cela ne donne pas de compilateur ou erreur d'exécution, mais je suis inquiet si cela créerait des problèmes si elle est largement utilisée.
J'apprécierais que quelqu'un puisse confirmer que cela causerait ou ne causerait pas de problèmes. (Tout autre commentaire est le bienvenu).
Je pense que cela fonctionne très bien. C'est le même modèle que Java utilise pour les types 'enum', qui sont déclarés comme [classe publique Enum>] (https://docs.oracle.com/javase/8/docs/api/java/lang /Enum.html) –
markspace
Comment cela ne vous donne-t-il pas une erreur de compilation? La classe d'implémentation n'est pas abstraite, vous avez donc besoin d'un corps de méthode pour cela. – Makoto
@Makoto cela donnerait une erreur en effet: D, c'était juste un exemple. changé maintenant. – n247s