If subclasses of C
are supposed to work with specific subclasses of A
(i.e. D
always works with B
), you can make C
generic:
class C<T extends A> {
T a;
C(T a) {
this.a = a;
}
...
}
class D extends C<B> {
D(B b) {
super(b);
}
...
}