Non, vous ne pouvez pas le faire si A est un type générique. (Bozho a répondu trop vite :) et a probablement pensé que A était un type concret.
Ce qui fonctionnera, c'est ce qui suit.
abstract class Agent extends Blah<ConcreteA>{
void callAgent();
Agent() {
ConcreteA.add();
}
}
mais ce n'est probablement pas ce que vous voulez faire.
Après avoir lu vos commentaires, il semble que ce que vous voulez vraiment faire, c'est.. :
abstract class Agent<A extends SomeClassThatSupportsAdd> {
void callAgent();
protected abstract A createNew();
Agent() {
A a = createNew();
A.add();
}
}
Vos sous-classes devront surcharger createNew()
.
Si vous n'aimez toujours pas cela, vous pouvez jeter un coup d'œil à AspectJ qui vous permettra de faire un peu de magie avec les constructeurs (voir comment Spring fait @Configurable), mais cela devient beaucoup plus délicat et complique les choses.
Une autre option est Scala. Java ne fait pas d'héritage sur les méthodes statiques, vous ne pouvez donc pas obtenir de modules paramétrés (groupes de fonctions dans certains langages, cela s'appelle un foncteur... ocaml). Cependant, Scala prend en charge un "objet" singleton qui permet l'héritage polymorphe fonctionnel paramétrique.