202 votos

¿Por qué no ' t Java Generics apoyar tipos primitivos?

¿Por qué funcionan los medicamentos genéricos en Java con objetos pero no con tipos primitivos?

Por ejemplo

Gen<Integer> inum = new Gen<Integer>(100); // works fine, but  
Gen<int> inums = new Gen<int>(100); // is not allowed.   

214voto

thecoop Puntos 23695

Los medicamentos genéricos en Java son un grupo completamente en tiempo de compilación construir el compilador convierte a todos los usos genéricos en moldes para el tipo de derecho. Esto es para mantener la compatibilidad con los anteriores JVM tiempos de ejecución.

Este:

List<ClassA> list = new ArrayList<ClassA>();
list.add(new ClassA());
ClassA a = list.get(0);

se convirtió en (aproximadamente):

List list = new ArrayList();
list.add(new ClassA());
ClassA a = (ClassA)list.get(0);

Así que, cualquier cosa que se utiliza como genéricos tiene que ser convertible a Objeto (en este ejemplo, get(0) devuelve un Object), y los tipos primitivos no. Por lo que no puede ser utilizado en los medicamentos genéricos.

C# es un asunto separado - los medicamentos genéricos son implementados directamente como parte de la ejecución, de modo que los tipos primitivos pueden ser utiliza - el CLR genera nuevas versiones de las clases genéricas para las primitivas y las estructuras de medida que se usan. La única desventaja es (hasta el momento .NET 4) no hay un genérico de covarianza o la contravarianza se le permitió, a diferencia de Java (ver el super y extends palabras clave en el genérico de las definiciones)

31voto

Stephen C Puntos 255558

En Java, los medicamentos genéricos funcionan de la manera en que lo hacen ... al menos en parte ... porque se han agregado a la lengua de un número de años después de que el lenguaje fue diseñado. El lenguaje de los diseñadores fueron limitados en sus opciones por los medicamentos genéricos por tener que venir para arriba con un diseño que era compatible con el lenguaje existente y la clase Java de la biblioteca.

Otros lenguajes de programación (por ejemplo, C++, C#, Ada) permiten que los tipos primitivos para ser usados como los tipos de parámetro para medicamentos genéricos. Pero la otra cara de esto es que tales lenguas' implementaciones de los medicamentos genéricos (o tipos de plantilla) normalmente implican la generación de una copia distinta de la de tipo genérico para cada tipo de parametrización.

6voto

ZeissS Puntos 4049

Las colecciones están definidas para requerir un tipo que se deriva de java.lang.Object . Los basetypes simplemente no hacerlo.

2voto

user2626445 Puntos 166

Antes, cuando no existían los medicamentos genéricos, que no había ningún problema de fundición de tipos primitivos de forma implícita o explícita (Sí habría una cierta pérdida de información).

Pero el problema se produjo cuando los objetos de diferentes clases son de casta (a Diferencia de las primitivas no podemos juzgar de qué cantidad de información que debe ser obsoleto en función del tipo de casting), por Lo que los medicamentos genéricos se han creado para mantener una estricta seguridad y atrapar a todos los classcastException error en tiempo de compilación en sí.

Las primitivas son de manera flexible que la de los objetos que es probablemente la razón.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: