Java génériques - pourquoi "s'étend T" permis, mais pas "implémente T"?


Je me demande s'il y a une raison particulière en Java pour utiliser toujours "extends" plutôt que "implements" pour définir des limites de typeparameters.

Exemple:

public interface C {}
public class A<B implements C>{} 

Est interdit mais

public class A<B extends C>{} 

Est correct. Quelle est la raison?

Author: Michael Myers, 2009-06-10

7 answers

Il n'y a pas de différence sémantique dans le langage de contrainte générique entre si une classe "implémente" ou "étend". Les possibilités de contrainte sont 'extends ' et' super ' - c'est-à-dire que cette classe est-elle assignable à l'autre (extends), ou cette classe est-elle assignable à partir de celle-ci (super).

 306
Author: Tetsujin no Oni, 2011-12-02 05:50:39

, La réponse est dans ici :

Pour déclarer un paramètre de type borné, lister le nom du paramètre de type, suivi du mot-clé extends, suivi de sa limite supérieure [.]. Notez que, dans ce contexte, s'étend est utilisé dans un sens général, signifie soit extends (comme dans les classes) ou implements (comme dans les interfaces).

Donc là vous l'avez, c'est un peu déroutant, et Oracle le sait.

 44
Author: MikaelF, 2016-11-03 02:01:44

Probablement parce que pour les deux côtés (B et C) seul le type est pertinent, pas l'implémentation. Dans votre exemple

public class A<B extends C>{}

B peut également être une interface. "s'étend" est utilisé pour définir des sous-interfaces ainsi que des sous-classes.

interface IntfSub extends IntfSuper {}
class ClzSub extends ClzSuper {}

J'ai l'habitude de penser à 'Sous étend Super' comme 'Sub, c'est comme Super - , mais avec des fonctionnalités supplémentaires", et "la Clozapine implémente Intf' comme 'Clozapine est une réalisation de Intf'. Dans votre exemple, cela correspondrait: B est comme C, mais avec des capacités supplémentaires. Les capacités sont pertinentes ici, pas la réalisation.

 15
Author: beetstra, 2009-06-10 16:08:15

Il se peut que le type de base soit un paramètre générique, donc le type réel peut être une interface d'une classe. Considérons:

class MyGen<T, U extends T> {

Aussi du point de vue du code client, les interfaces sont presque indiscernables des classes, alors que pour le sous-type, c'est important.

 7
Author: Tom Hawtin - tackline, 2009-06-10 15:48:50

Voici un exemple plus impliqué de l'endroit où extends est autorisé et peut-être ce que vous voulez:

public class A<T1 extends Comparable<T1>>

 7
Author: ntg, 2014-06-12 16:51:36

C'est en quelque sorte arbitraire lequel des termes à utiliser. Il aurait été de toute façon. Peut-être que les concepteurs de langage ont pensé à "étend" comme le terme le plus fondamental, et "implémente" comme cas particulier pour les interfaces.

Mais je pense que implements aurait un peu plus de sens. Je pense que cela communique plus que les types de paramètres ne doivent pas nécessairement être dans une relation d'héritage, ils peuvent être dans n'importe quel type de relation de sous-type.

Le Glossaire Java exprime un vue similaire.

 5
Author: Lii, 2016-01-22 09:35:08

Parce que les interfaces ne sont que des classes, sauf qu'elles n'ont pas d'attributs ou d'implémentations. La seule utilisation du mot-clé "instruments" est de permettre à une classe d'hériter de plusieurs interfaces, mais pas plusieurs classes, et nous pouvons le voir dans le code. Je ne sais pas s'ils le préciseront à l'avenir, mais ce n'est pas un must.

 -2
Author: Alfredo Barbosa, 2016-08-13 18:16:50