Java noob: generics sobre objetos solamente?

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

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 se puede hacer 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 o Set es ilegal. Solo se pueden usar tipos de referencia para crear instancias de tipos y métodos generics. En lugar de List debemos declarar una List , 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 generics 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 generics. 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

  • Effective Java 2nd Edition, Item 49: Prefiere tipos primitivos a tipos en caja
  • Guía de lenguaje Java / Autoboxing
  • Guía de lenguaje Java / Genéricos
  • Tutoriales / Genéricos de Java

¿Es solo posible en Java instanciar generics 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 generics 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 comstack en bytecode todos los tipos generics se reemplazan por Object , esto se hizo para que los generics 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.