Génériques Java pour imposer le type de retour de la méthode abstraite

J’ai la situation suivante:

abstract class X { abstract X someMethod (...) {...} }. 

Maintenant, je veux contraindre toute implémentation de X à ce que sa méthode ‘someMethod’ renvoie ce type d’implémentation, et pas seulement X:

 class X1 extends X { X1 someMethod (...) {...} }. class X1 extends X { X someMethod (...) {...} }. //want this to be flagged as an error class X2 extends X { X1 someMethod (...) {...} }. //want this to be flagged as an error too 

Est-il possible d’y parvenir en utilisant des génériques Java?

MODIFIER

D’accord. J’ai seulement posé la question oui / non et j’ai obtenu un “oui”. Ma faute. Ce qui m’intéressait réellement était “comment puis-je écrire les déclarations”.

Cela fonctionne aussi bien.

 abstract class X { public abstract T yourMethod(); } class X1 extends X { public X1 yourMethod() { return this; } } class X2 extends X { public X2 yourMethod() { return this; } } 
 abstract class X> { protected X(Class implClazz) { if (!getClass().equals(implClazz)) { throw new IllegalArgumentException(); } } abstract I someMethod(); } 

Justification: vous ne pouvez pas faire référence au type dynamic dans les limites de type, d’où la vérification indirecte dans le constructeur.

Voici une approche qui vous permet de retourner un type de paramètre pour this :

 AbstractFoo> { /** Subclasses must implement to return {@code this}. */ protected abstract T getThis(); /** Does something interesting and returns this Foo */ public T inheritedThing { /* blah di blah */ return getThis(); } } 

Oui. C’est la covariance de type de retour .

Cela devrait fonctionner très bien:

 class X { abstract T someMethod(...); } class X1 extends X T1 someMethod(...) { ... } }