The point is that an implementation of void method(Holder<?> holder) needs to be able to accept any of: Holder<SomeClass>, Holder<SomeClass2>, Holder<Void> etc
If you try to declare the method as void method(Holder<SomeClass> holder) in subclasses, that implies that you can invoke provider methods on the holder (e.g. SomeClass value = holder.get()), but that would fail with a class cast exception if the parameter is actually of type Holder<Void>, for instance.
As such, it is forbidden by the type system.
You need to have a type variable at the class level:
abstract class BaseClass<T> {
abstract void method(Holder<T> aHolder);
}
Then you can create concrete classes:
class SomeClassBaseClass extends BaseClass<SomeClass> {
@Override void method(Holder<SomeClass> aHolder) {}
}