J'ai rencontré un problème en essayant de spécialiser une classe qui implémente une interface générique dont je voulais hériter de la même interface que la super classe, mais avec un argument de type plus spécifique . L'extrait suivant montre un exemple synthétique mais complet qui ne peut pas être compilé. Le commentaire contient le message d'erreur du compilateur Java.Hériter d'une interface générique plusieurs fois tout en respectant la variance
interface Producer<T> {
T get();
}
class NumberProducer implements Producer<Number> {
@Override
public Number get() { return null; }
}
// Producer cannot be inherited with different arguments: <java.lang.Integer> and <java.lang.Number>
class IntegerProducer extends NumberProducer implements Producer<Integer> {
@Override
public Integer get() { return null; }
}
Au sens PECS, Producer<T>
est un producteur , donc Producer<Integer>
serait un sous-type de Producer<Number>
, mais il n'y a aucun moyen de déclarer que dans la définition de Producer<T>
. Java n'autorise pas IntegerProducer
à hériter de NumberProducer
et Producer<Integer>
en même temps que IntegerProducer
hériterait alors de Producer<Integer>
et Producer<Number>
en même temps.
Existe-t-il une approche standard de cette limitation, par ex. un modèle qui résout le même problème sans nécessiter ce type d'héritage?
Pourquoi voudriez-vous mettre en œuvre l'interface IntegerProducer? Vous pouvez remplacer la méthode get() sans implémenter l'interface. –
Pourriez-vous donner un exemple de la façon dont ces classes sont destinées à être utilisées? Je ne suis pas sûr que même la suggestion commune de faire générique 'NumberProducer' fera ce que vous voulez faire. Si vous utilisez 'NumberProducer implémente Producer ', vous ne pouvez rien retourner sauf 'null' de' NumberProducer.get() 'car vous ne savez pas quel sous-type de' Number' est 'T'. C'est-à-dire que vous ne pouvez pas retourner 'new Number()' (je sais que le constructeur n'existe pas, mais supporter avec moi) car 'T' pourrait, en fait, être' Integer'. –
millimoose