Pourquoi les médicaments Génériques en Java travailler avec des objets, mais pas avec les types primitifs?
Par exemple
Gen<Integer> inum = new Gen<Integer>(100); // works fine, but
Gen<int> inums = new Gen<int>(100); // is not allowed.
Pourquoi les médicaments Génériques en Java travailler avec des objets, mais pas avec les types primitifs?
Par exemple
Gen<Integer> inum = new Gen<Integer>(100); // works fine, but
Gen<int> inums = new Gen<int>(100); // is not allowed.
Les médicaments génériques en Java entièrement au moment de la compilation, la construction, le compilateur transforme tous les génériques utilise en jette pour le type de droit. C'est afin d'assurer la rétrocompatibilité avec les précédents JVM runtimes.
Ce:
List<ClassA> list = new ArrayList<ClassA>();
list.add(new ClassA());
ClassA a = list.get(0);
est transformé en (à peu près):
List list = new ArrayList();
list.add(new ClassA());
ClassA a = (ClassA)list.get(0);
Donc, tout ce qui est utilisé en tant que générique doit être modulable à l'Objet (dans cet exemple, get(0)
renvoie un Object
), et les types primitifs ne sont pas. Donc ils ne peuvent pas être utilisés dans les génériques.
C# est une question distincte - les génériques sont directement mis en œuvre dans le cadre de l'exécution, de sorte que les types primitifs peuvent être utilisés, le CLR génère de nouvelles versions de classes génériques pour les primitives et les structures telles qu'elles sont utilisées. Le seul inconvénient est (jusqu' .NET 4) pas de générique de covariance ou de contravariance a été autorisé, à la différence de Java (voir l' super
et extends
mots clés des définitions génériques)
En Java, les génériques de travail comme ils le font ... au moins dans la partie ... parce qu'ils ont été ajoutés à la langue un certain nombre d'années après le langage a été conçu. La langue designers ont été limitées dans leurs options pour les médicaments génériques d'avoir à venir avec un design rétro-compatible avec l'existant, de la langue et de la bibliothèque de classes Java.
D'autres langages de programmation (par exemple C++, C#, Ada) permettent à des types primitifs pour être utilisé comme paramètre de types génériques. Mais le revers de la médaille est que ces langues mise en œuvre de génériques (ou types de modèle) comportent habituellement génération d'une copie du type générique pour chaque type de paramétrage.
Auparavant, quand il n'y avait pas de génériques, il n'y a pas de problème de casting primitives implicitement ou explicitement (Oui, il serait certaine perte d'information).
Mais le problème est survenu lorsque les objets de classes différentes sont en cours de caste (à la différence des primitives, nous ne pouvons pas juger de ce que la quantité d'informations doit être désapprouvée selon le type de casting), de Sorte que les génériques ont été créés pour maintenir la stricte type de sécurité et attraper tous les classcastException erreur lors de la compilation elle-même.
Les Primitives sont de manière flexible que des objets qui est probablement la raison.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.