tipos primitivos objeto ejemplos definicion declaracion datos java generics primitive

java - objeto - tipos de datos primitivos en c



¿Por qué Java Generics no admite tipos primitivos? (5)

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

Por ejemplo, esto funciona bien:

List<Integer> foo = new ArrayList<Integer>();

pero esto no está permitido:

List<int> bar = new ArrayList<int>();


De acuerdo con la documentación de Java , las variables de tipo genérico solo se pueden instanciar con tipos de referencia, no con tipos primitivos.

Se supone que esto vendrá en Java 10 bajo el Proyecto Valhalla .

En el artículo de Brian Goetz sobre Estado de la Especialización.

Existe una excelente explicación sobre la razón por la cual los genéricos no fueron compatibles con primitivos. Y, cómo se implementará en futuras versiones de Java.

La implementación borrada actual de Java que produce una clase para todas las instancias de referencia y no admite las instancias primitivas. (Esta es una traducción homogénea, y la restricción de que los genéricos de Java solo pueden abarcar los tipos de referencia proviene de las limitaciones de la traducción homogénea con respecto al conjunto de códigos de bytes de la JVM, que utiliza diferentes códigos de bytes para operaciones en los tipos de referencia frente a los tipos primitivos). Sin embargo, los genéricos borrados en Java proporcionan tanto la parametricidad del comportamiento (métodos genéricos) como la parametricidad de los datos (ejemplificaciones en bruto y comodín de tipos genéricos).

...

se eligió una estrategia de traducción homogénea, donde las variables de tipo genérico se borran a sus límites a medida que se incorporan en el código de bytes. Esto significa que si una clase es genérica o no, aún se compila en una sola clase, con el mismo nombre, y cuyas firmas de miembros son las mismas. La seguridad de los tipos se verifica en el momento de la compilación y el tiempo de ejecución no está restringido por el sistema de tipo genérico. A su vez, esto impuso la restricción de que los genéricos solo podían funcionar sobre tipos de referencia, ya que Objeto es el tipo más general disponible, y no se extiende a los tipos primitivos.


En Java, los genéricos funcionan como lo hacen ... al menos en parte ... porque se agregaron al lenguaje varios años después de que el lenguaje fue diseñado 1 . Los diseñadores de lenguajes se vieron limitados en sus opciones de genéricos al tener que idear un diseño que fuera compatible con el lenguaje existente y la biblioteca de clases de Java .

Otros lenguajes de programación (por ejemplo, C ++, C #, Ada) permiten que se usen tipos primitivos como tipos de parámetros para genéricos. Pero la otra cara de hacer esto es que las implementaciones de genéricos (o tipos de plantillas) de estos lenguajes típicamente conllevan la generación de una copia distinta del tipo genérico para cada tipo de parametrización.

1 - La razón por la cual los genéricos no se incluyeron en Java 1.0 fue debido a la presión del tiempo. Sintieron que tenían que lanzar el lenguaje Java rápidamente para llenar la nueva oportunidad de mercado presentada por los navegadores web. James Gosling ha declarado que le hubiera gustado incluir genéricos si hubieran tenido el tiempo. Lo que el lenguaje Java hubiera parecido si esto hubiera sucedido es la conjetura de cualquiera.


En Java, los genéricos se implementan utilizando "Borrado de tipo" para la compatibilidad con versiones anteriores. Todos los tipos genéricos se convierten en objeto en tiempo de ejecución. por ejemplo,

public class Container<T> { private T data; public T getData() { return data; } }

se verá en tiempo de ejecución como,

public class Container { private Object data; public Object getData() { return data; } }

El compilador es responsable de proporcionar el reparto adecuado para garantizar la seguridad del tipo.

Container<Integer> val = new Container<Integer>(); Integer data = val.getData()

se convertirá

Container val = new Container(); Integer data = (Integer) val.getData()

Ahora la pregunta es ¿por qué "Objeto" se elige como tipo en tiempo de ejecución?

La respuesta es Objeto es la superclase de todos los objetos y puede representar cualquier objeto definido por el usuario.

Dado que todas las primitivas no se heredan de " Objeto ", no podemos usarlo como un tipo genérico.

Para su información: Proyecto Valhalla está tratando de abordar el problema anterior.


Las colecciones se definen para requerir un tipo que se deriva de java.lang.Object . Los basetypes simplemente no hacen eso.


Los genéricos en Java son una construcción completamente de tiempo de compilación: el compilador convierte todos los usos genéricos en conversiones al tipo correcto. Esto es para mantener la compatibilidad hacia atrás con los tiempos de ejecución anteriores de JVM.

Esta:

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

se convierte en (aproximadamente):

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

Por lo tanto, todo lo que se use como genéricos tiene que ser convertible a Objeto (en este ejemplo, get(0) devuelve un Object ), y los tipos primitivos no lo son. Así que no pueden ser usados ​​en genéricos.