useful type parameter method generic example are java generics

type - java generics parameter



Java noob: genéricos sobre objetos solamente? (4)

Soy nuevo en Java. Mientras codificaba un Map <>, descubrí que declarar Map<int, int> es un error de sintaxis, mientras que Map<Integer, Integer> está OK. ¿Es solo posible en Java instanciar genéricos sobre tipos de objetos, a diferencia de primitivos? Si es así, ¿hay una penalización de rendimiento notable para el boxeo / desempaquetado de primitivos?


¿Es solo posible en Java instanciar genéricos sobre tipos de objetos, a diferencia de primitivos?

correcto.

Si es así, ¿hay una penalización de rendimiento notable para el boxeo / desempaquetado de primitivos?

sí hay.

Consulte aquí para obtener una descripción detallada: http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html


1) Sí, los genéricos de Java solo funcionan en tipos de objetos. Esto se debe a la forma en que se implementan, que es a través del borrado de tipos ; en esencia, una vez que se compila en bytecode todos los tipos genéricos se reemplazan por Object , esto se hizo para que los genéricos de Java pudieran funcionar sin modificar el JVM / bytecode subyacente (mal decisión, imo).

2) Sí, habrá alguna penalización de boxeo / unboxing; no se puede evitar, me temo


Como otros han notado, hay una penalización de rendimiento para usar clases de contenedor para primitivas. Y a pesar de que el costo no es realmente notable, si REALMENTE necesita el aumento de rendimiento adicional, puede simplemente crear subclases personalizadas para la clase List, una para cada tipo primitivo (no son muchas así que eso no es un problema) y simplemente anular los métodos que ponen y obtienen valores en la lista y los limitan a aceptar cada primitiva. Esto dará como resultado el aumento del rendimiento y mantendrá la verbosidad del código de la lista genérica.


Sí, solo puede usar tipos de referencia para los parámetros de tipo genérico, y sí, habrá alguna penalización de rendimiento debido al boxeo / unboxing (que puede hacerse automáticamente en su mayor parte).

Aquí hay una cita de las preguntas frecuentes de Java Generics :

¿Están permitidos los tipos primitivos como argumentos de tipo?

No. Solo los tipos de referencia se pueden usar como argumentos de tipo. Un tipo parametrizado como List<int> o Set<short> es ilegal. Solo se pueden usar tipos de referencia para crear instancias de tipos y métodos genéricos. En lugar de List<int> debemos declarar una List<Integer> , utilizando el tipo de envoltorio correspondiente como argumento de tipo.

[...] Tenga en cuenta que la falta de instancias de tipo primitivo incurre en una penalización de rendimiento. Autoboxing y -unboxing hacen que el uso de instancias tipo envoltorio de tipos genéricos sea muy conveniente y conciso en el código fuente. Pero la notación concisa oculta el hecho de que detrás de la cortina la máquina virtual crea y usa muchos objetos de envoltura, cada uno de los cuales debe asignarse y luego recogerse la basura. El mayor rendimiento del uso directo de los valores de tipo primitivo no se puede lograr con tipos genéricos. Solo un tipo regular puede proporcionar el rendimiento óptimo del uso de valores de tipo primitivo.

Si necesita absolutamente el rendimiento, Trove tiene muchas estructuras de datos especializadas para tipos primitivos, pero para la mayoría de los propósitos prácticos, el uso de tipos primitivos encuadrados con las clases de Java Collections Framework debería ofrecer un rendimiento superior al aceptable.

Ver también