I have the following situation :
abstract class X { abstract X someMethod (...) {...} }.
Now I want to constrain any implementation of X to
This should work just fine:
class X<T> {
abstract T someMethod(...);
}
class X1<T1> extends X
T1 someMethod(...) {
...
}
}
Yes. This is return type covariance.
Here's an approach that lets you return a parameter type for this
:
AbstractFoo<T extends AbstractFoo<T>> {
/** 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();
}
}
This works as well;
abstract class X<T> {
public abstract T yourMethod();
}
class X1 extends X<X1> {
public X1 yourMethod() {
return this;
}
}
class X2 extends X<X2> {
public X2 yourMethod() {
return this;
}
}
abstract class X<I extends X<I>> {
protected X(Class<I> implClazz) {
if (!getClass().equals(implClazz)) {
throw new IllegalArgumentException();
}
}
abstract I someMethod();
}
Rationale: You can not refer to the dynamic type in type bounds, hence the indirect check in the constructor.