Question

Au risque de devenir l'idiot du village, quelqu'un peut-il m'expliquer pourquoi les génériques sont appelés génériques ?Je comprends leur utilisation et leurs avantages, mais si le définition du générique est « général » et les collections génériques sont de type sécurisé, alors pourquoi n'est-ce pas un terme abusif ?

Par exemple, une ArrayList peut contenir tout ce qui est un objet :

ArrayList myObjects = new ArrayList();
myObjects.Add("one");
myObjects.Add(1);

alors qu'une collection générique de type string ne peut contenir que des chaînes :

var myStrings = new List<string>();
myStrings.Add("one");
myStrings.Add("1");

Je ne comprends tout simplement pas pourquoi on l'appelle "générique".Si la réponse est "... ce qui permet de concevoir des classes et des méthodes qui reportent la spécification d'un ou plusieurs types jusqu'à ce que la classe ou la méthode soit déclarée et instanciée par le code client." depuis ici, alors je suppose que cela a du sens.Peut-être que je souffre de cette erreur mentale parce que j'ai commencé à programmer seulement après que Java ait introduit les génériques, donc je ne me souviens pas d'une époque antérieure à eux.Mais reste...

Toute aide est appréciée.

Était-ce utile?

La solution

" Generic " parle de la mise en œuvre. Vous écrivez un seul & Quot; Generic & Quot; liste les implémentations qui fonctionnent avec n’importe quel type, au lieu de devoir écrire des implémentations spécifiques pour chaque type que vous voulez utiliser.

Autres conseils

Je pense que la bonne réponse à des questions comme celle-ci est presque toujours « des raisons historiques, principalement ».Les génériques auraient tout aussi bien pu être appelés « schémas » ou « classes » ou « familles de types » ou « genres » ou « fonctions de types » ou « statiques » ou « types grecs » ou n'importe quoi parmi un million d'autres choses.Il y a longtemps, quelqu'un a décidé d'utiliser le mot « générique », et il est resté.

Le terme « générique » au sens Java remonte au moins au milieu des années 1970.Les Etats Unis.Le ministère de la Défense était en train de peaufiner un document d'exigences pour son nouveau langage de programmation (ce qui allait devenir ADA).Une première ébauche ("Homme de bois", août 1975) dit :

Les paramètres de compilation sont nécessaires dans les langages extensibles pour permettre la spécification de procédures génériques et de structures de données telles que des piles et des files d'attente sans répéter la définition pour chaque type d'élément.

C'est la seule utilisation du terme « générique » dans le document.Je ne comprends pas clairement comment cela était prévu.Mais en juillet 1977 ("L'homme d'étain"), il y avait tout un paragraphe sur les génériques, et le terme en était clairement venu à signifier quelque chose de spécifique :

12D.DÉFINITIONS GÉNÉRIQUES

Il doit être possible de définir des fonctions, des procédures et des types avec des paramètres qui sont instanciés lors de la traduction à chaque appel.Ces paramètres peuvent être n'importe quel identifiant défini (y compris ceux des variables, des fonctions ou des types), une expression ou une instruction.Ces paramètres, comme tous les autres paramètres, doivent être évalués dans le contexte de l'appel.

En juin 1978 ("Homme d'acier") c'était un jargon établi ;il y avait d'autres utilisations du terme « générique » dans d'autres sections du document, faisant clairement référence à cette fonctionnalité.Dans la langue finie, generic était un mot réservé.

Les auteurs de ces documents sont répertoriés sur le site et la plupart sont probablement toujours là.Ce serait bien de les appeler et de leur demander ce dont ils se souviennent.


La première utilisation plausible du terme « générique » que j'ai trouvée dans le monde universitaire se trouvait dans l'ouvrage de Robin Milner. "Une théorie du polymorphisme de types en programmation" (1978) (et il se sent obligé d'expliquer ce qu'il entend par « générique », donc cela ne peut pas avoir été d'usage courant dans le monde universitaire à cette époque) :

C'est donc le type générique de carte, c'est-à-dire à toute occurrence de carte dans le cadre de cette déclaration, une instance de substitution de ce type doit être attribuée.

"Variable de type générique" est devenu le jargon CS.

bool Equals(int x, int y)

La méthode ci-dessus ne peut comparer que des entiers, nous pouvons donc dire qu'elle est spécialisée pour comparer des entiers.

bool Equals<T>(T x, T y);

La méthode ci-dessus peut comparer des valeurs de n'importe quel type. Par conséquent, nous pouvons dire que ce n'est pas spécialisé pour un type particulier - c'est générique .

Je ne veux pas entrer dans la sémantique de la langue (anglais, pas java), et au risque de vous répondre avec une tautologie; une méthode générique est dite générique car, comme vous l'avez dit, on peut l'utiliser au sens général, elle n'a pas de type spécifique, elle peut être utilisée de manière générale

D'accord, prenez ceci avec un grain de sel, car je suis totalement en train de deviner, mais je me demande s'il pourrait s'agir d'une bâtardise de & "Generative". Types & ";

Conceptuellement, lorsque vous spécialisez une liste dans une liste < String & Gt ;, il génère un nouveau type. Du moins, c’est ainsi que cela fonctionne dans les modèles C ++ et dans les génériques C #.

En Java, étant donné que les paramétrages sont ignorés par le compilateur à l'aide de l'effacement de type, ne crée pas de nouveau type spécialisé, alors qui sait?

Je suppose que vous pourriez dire que Java implémente une version générique des types génératifs:)

ON EDIT:

Voici un autre point de vue ...

Le type List < String & Gt; n'est pas ce dont ils parlent quand ils se réfèrent à un & "générique &"; type. Je pense que la terminologie fait en réalité référence à la liste & Lt; T & Gt; type, c'est-à-dire comment le type existe sous sa forme générique. List & Lt; String & Gt; est une spécialisation de la liste générique < T & Gt;.

S'ils l'ont appelé " tapez paramètre (s) " les gens le confondraient avec les paramètres de type Type.

De plus, ArrayList n'est pas & "générique &"; Cela fonctionne UNIQUEMENT avec les types d'objet. Si vous lui demandez quelque chose, cela vous donnera une référence à un objet. C'est un comportement très spécifique.

Une classe qui prend des objets n'est PAS générique, elle prend très spécifiquement un type qui est lui-même un type générique. Une classe générique, en revanche, peut être utilisée avec n'importe quel type spécifique.

Parce que vous créez " Generic " code qui sera capable de fonctionner sur tout type (dans les contraintes que vous spécifiez) de la même manière ...

Un bon exemple que vous connaissez bien est que l’opérateur Ajouter correspond à n’importe quel langage ... il peut & "Ajouter &"; entiers, flottants, doubles, décimales, binaires, hexadécimaux, qu'ils soient signés ou non, combien de bits ils sont, etc ...

Je ne suis pas un " natif " Monsieur le Président, je peux donc me tromper, mais c’est le but du & "Generics &" est-ce que c'est le type Define Generics, n'est-ce pas?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top