Нет, вы не можете сделать это, если A является универсальным типом.(Божо ответил быстро :) и, вероятно, подумал, что это был конкретный тип.
Будет работать следующее.
abstract class Agent extends Blah<ConcreteA>{
void callAgent();
Agent() {
ConcreteA.add();
}
}
, но это, вероятно, не то, что вы хотите сделать.
После прочтения ваших комментариев это звучит так:
abstract class Agent<A extends SomeClassThatSupportsAdd> {
void callAgent();
protected abstract A createNew();
Agent() {
A a = createNew();
A.add();
}
}
Ваши подклассы должны будут переопределить createNew()
.
Если вам все еще не нравится этовы можете взглянуть на AspectJ, который позволит вам использовать магию конструктора (посмотрите, как spring делает @Configurable), но это становится намного сложнее и усложняет вещи.
Другой вариант - Scala.Java не наследует статические методы, поэтому вы не можете получить параметризованные модули (группы функций в некоторых языках это называется функтором ... ocaml).Однако Scala поддерживает одноэлементный «объект», который допускает параметрическое функциональное полиморфное наследование.