J'ai une classe abstraite générique Factory<T>
avec une méthode createBoxedInstance()
qui retourne les instances de T
créées par les implémentations de createInstance()
enveloppés dans le conteneur générique Box<T>
.usine générique de conteneurs génériques
abstract class Factory<T> {
abstract T createInstance();
public final Box<T> createBoxedInstance() {
return new Box<T>(createInstance());
}
public final class Box<T> {
public final T content;
public Box(T content) {
this.content = content;
}
}
}
À certains moments, je besoin d'un conteneur de type Box<S>
où S
est un ancêtre de T
. Est-il possible de faire lui-même createBoxedInstance()
générique afin qu'il retournera les instances de Box<S>
où S
est choisi par l'appelant? Malheureusement, définir la fonction comme suit ne fonctionne pas comme un paramètre de type ne peut pas être déclaré en utilisant le mot-clé super, seulement utilisé.
public final <S super T> Box<S> createBoxedInstance() {
return new Box<S>(createInstance());
}
La seule alternative que je vois, est de rendre tous les lieux qui ont besoin d'une instance de Box<S>
accepter Box<? extends S>
qui fait assignable à S
membre contenu du conteneur.
Existe-t-il un moyen de contourner cela sans re-boxer les instances de T
dans des conteneurs de type Box<S>
? (Je sais que je pouvais jeter le Box<T>
à un Box<S>
mais je me sentais très, très coupable.)
Avez-vous essayé la classe abstraite Factory, puis utilisez uniquement T createInstance(), tout en utilisant S partout ailleurs? Ou peut-être une classe abstraite Factory ? –
Luis
Si vous voulez un 'Box
' pourquoi ne pas utiliser un 'Factory' Le problème que vous avez est que même si S étend T vous ne pouvez pas connaître un 'Factoy' crée un S en boîte, il pourrait être un boxed U (qui s'étend également T) –
@Luis Le problème avec cela est que je dois décider à l'avance quel type je veux utiliser pour S. L'idée est que je peux créer une usine de T, puis l'utiliser pour créer en boîte T avec différents paramètres de type pour S. – Feuermurmel