AFAIK, mes extends
classes et implements
interfaces parentales . Mais je rencontre une situation où je ne peux pas l'utiliser implements SomeInterface
. C'est la déclaration d'un type générique. Par exemple:
public interface CallsForGrow {...}
public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work!
extends ArrayList<T>
Ici, l'utilisation implements
est interdite syntaxiquement. J'ai d'abord pensé qu'il était interdit d'utiliser l'interface à l'intérieur de <>, mais non. C'est possible, je n'ai qu'à utiliser à la extends
place de implements
. En conséquence, je "prolonge" une interface. Cet autre exemple fonctionne:
public interface CallsForGrow {...}
public class GrowingArrayList <T extends CallsForGrow> // this works!
extends ArrayList<T>
Cela me semble être une incohérence syntaxique. Mais peut-être que je ne comprends pas certaines finesses de Java 6? Y a-t-il d'autres endroits où je devrais étendre les interfaces? L'interface, que je veux étendre, devrait-elle avoir des fonctionnalités spéciales?
la source
extends
etimplements
, c'est juste quand on regarde le problème du point de vue du système de type pur, qu'il n'y a pas de différence.T
une classe?T
pourrait référencer un type d'interface ou unenum
type.:
. et sous les couvertures, une interface est et a toujours été une classe abstraite avec la contrainte de ne contenir que desabstract
membres virtual ( ) non implémentés , afin de permettre l'héritage multiple. il n'y a littéralement aucune différence entreimplements
etextends
. ils pourraient tous deux être remplacés par le même mot (extends
) ou par un symbole arbitraire (:
) et rien ne serait perdu.Lorsque Java 5, et en particulier les génériques, a été initialement mis à la disposition des développeurs qui avaient manifesté un intérêt, la syntaxe était tout à fait différente. Au lieu de
Set<? extends Foo>
etSet<? super Bar>
il y avaitSet<+Foo>
etSet<-Foo>
. Cependant, la rétroaction était qu'il n'était pas clair si cela+
signifiait plus spécifique ou plus large (plus de classes) . Sun a répondu à cette rétroaction en changeant la syntaxe, mais dans la contrainte de ne pas introduire de nouveaux mots clés, ce qui aurait posé un problème de compatibilité descendante.Le résultat est que ni l'un ni l'autre n'est tout à fait naturel. Comme vous le constatez,
extends
est surchargé pour parler de classes "étendant" les interfaces, ce qui n'est pas le langage utilisé dans d'autres contextes; etsuper
est surchargé pour signifier "est une superclasse de", qui est la direction opposée de la relation précédemment exprimée par le mot-clé, c'est-à-dire se référant à une superclasse.Cependant, les principes fondamentaux de ce qu'est une interface ne sont pas affectés par ce changement, et il n'introduit pas d'interfaces spéciales qui sont étendues d'une nouvelle manière.
la source
Il y a des inconvénients à autoriser et à interdire une telle syntaxe, et ceux d' autoriser sont bien plus importants.
Pensez-y.
La séparation de l'interface et de l'implémentation est l'un des idiomes de programmation fondamentaux. Pour cette raison, la syntaxe permettant d'épeler "l'interface implémente quelque chose" serait à peu près aussi mauvaise que celle utilisant le signe plus pour désigner la multiplication des opérandes.
la source
Il faut comprendre la programmation pilotée par interface comme prochaine étape tout en comprenant une interface. Il indique quelle est l'utilisation réelle de l'interface. Quel rôle il joue dans un programme Java (ou tout autre langage).
la source