El concepto de wildcard capture en Java
Escrito por
el .
java
planeta-codigo
Enlace permanente
Comentarios
Con la introducción de los generics en el lenguaje Java en la versión de Java 5 se añadió validación de tipos a por ejemplo las colecciones, y entre ellos los elementos wildcard definidos con un ?. Una lista definida como List<?> se considera una lista de elementos de un tipo desconocido, todas las colecciones pre-java5 se consideran a partir de Java 5 de forma efectiva como List<?> o List<? extends Object> a partir de Java 5.
El siguiente código produce un error de compilación con el mensaje capture of ya que el compilador no puede validar que el tipo que se inserta en la lista, Object, como primer elemento si es compatible en tiempo de ejecución con el tipo de elementos que tiene la lista:
|
|
|
|
El método bar() define como parámetro una lista raw y es capaz de extraer un Object ya que todo objeto hereda de él e insertar un Object ya que es una lista raw, el compilador realiza el type erasure y la considera como List<Object> pero el compilador advierte del posible error en tiempo de ejecución con el mensaje Note: WildcardError.java uses unchecked or unsafe operations, en este caso la advertencia es innecesaria ya que se inserta un elemento extraído de la propia lista, se puede suprimir anotando el método con @SuppressWarnings(“unchecked”).
Para establecer una relación entre dos tipos se deben usar type parameters, en este caso para el tipo que se extrae de la lista y el tipo insertado en la lista. Para que el código anterior compile hay que escribir un método que capture el tipo del wildcard, estos métodos por convención se nombran añadiendo al final la palabra Helper. En este caso otra alternativa es definir el método como en bar() aunque un List<?> y un List<T> no son lo mismo el primero admite más tipos de listas parametrizadas.
|
|
Este concepto de wildcard capture genera bastantes dudas y en internet hay múltiples artículos tratando de explicarlo.
- Why use a wildcard capture helper method? es la mejor explicación que he encontrado de wildcard capture.
- Wildcard Capture and Helper Methods
- Capturing wildcards in Java generics
- Java Generics Wildcard Capture - A Useful Thing to Know
- Java Generics: Wildcard capture misunderstanding
- Going wild with generics, Part 1
- Why use a wild card capture helper method?
- When to use generic methods and when to use wild-card?