Générique de l'usine avec des inconnus de la mise en œuvre des classes
Supposons deux interfaces:
public interface FruitHandler<T extends Fruit>
{
setFruit(T fruit);
T getFruit();
}
public interface Fruit
{
}
Maintenant, je veux une usine à créer FruitHandlers
(par exemple AppleHander
, OrangeHandler
, ...), mais le FruitHandlerFactory
ne sais pas nécessaire sur la mise en œuvre de classes des deux interfaces (comme dans java paramétrable générique statique usine). Le FruitHandlerFactory
devrait fonctionner de cette manière (où OrangeHandler
implémente FruitHandler
et Orange
implémente Fruit
):
FruitHandlerFactory fhf = new FruitHandlerFactory<OrangeHandler,Orange>();
OrangeHandler fh = fhf.create();
Orange orange = (Orange)fh.getFruit();
Ce devrait être l'usine:
public class FruitHandlerFactory<A extends FruitHandler, B extends Fruit>
{
public FruitHandler create()
{
FruitHandler<Fruit> fh = new A<B>(); //<--- ERROR
fh.setFruit(new B());
return fh;
}
}
Où j'obtiens cette erreur:
The type A is not generic; it cannot be parameterized with arguments <B>
BTW: Est-il possible de faire la create()
méthode statique?
- Excellente question, et un grand fragment de code pour illustrer.
Vous devez vous connecter pour publier un commentaire.
Puisque les génériques en Java sont mis en œuvre à l'aide de l'effacement, les informations de type de
FruitHandlerFactory
ne sera pas disponible au moment de l'exécution, ce qui signifie que vous ne pouvez pas instancierA
(ouB
) de cette façon.Vous peut, cependant passer dans un
Class
objet du type correct pour contourner ce problème:Un petit bémol, c'est que vous aurez à écrire les noms de type trois fois(1) si vous souhaitez instancier un
FruitHandlerFactory
:Vous pouvez réduire quelque peu que par la production d'un
static
createFactory()
méthode sur votreFruitHandlerFactory
:et de l'utiliser comme ceci:
De cette question:
Peut-être essayer ceci?