Soy nuevo en algunas de las estructuras de datos incorporadas en JAVA y observé mientras jugaba con LinkedList que este código no genera un error:
LinkedList<?> list = new LinkedList<Integer>();
¿Alguien puede por favor explicarme cómo podemos tener esto?como una declaracion valida? Estoy usando Eclipse y no muestra ningún error en la inicialización. Agregar elementos después de esto, sin embargo, no funciona en este caso.
Respuestas
4 para la respuesta № 1En
LinkedList<?> list;
estas declarando una variable nombrada list
de tipo LinkedList
y proporcionando el comodín ?
como un argumento de tipo para ser vinculado a LinkedList
"s tipo de parámetro T
. Asi que list
será de tipo LinkedList<?>
. Este comodín ?
capturará algún tipo, pero Ese tipo será desconocido e inutilizable.
Esta
new LinkedList<Integer>();
es una expresión de creación de instancia. Estás creando una instancia de tipo LinkedList
mientras proporciona un tipo de argumento de tipo Integer
obligarse a LinkedList
"s tipo de parámetro T
. Por lo tanto, el tipo de expresión de creación de instancia será LinkedList<Integer>
.
Tenga en cuenta que estará interactuando con el creado LinkedList
a través de la variable list
de tipo LinkedList<?>
. Entonces, independientemente del tipo de argumento que usaste para crearlo, ahora lo estás viendo a través de un valor de tipo LinkedList<?>
.
Ahora, puedes asignar un valor de tipo LinkedList<Integer>
a una variable de tipo LinkedList<?>
porque LinkedList<?>
es un super tipo de LinkedList<Integer>
. Podemos entrar en detalles sobre por qué este es el caso, pero las reglas se describen aquí.
Como para
LinkedList<?> list = new LinkedList<>();
la notación <>
denota que el argumento de tipo para la expresión de creación de instancia debe inferirse. Las reglas para inferencias tipográficas son numerosas y complejas. Básicamente, desde ?
denota un tipo desconocido, lo único de lo que podemos estar seguros es que el argumento de tipo debería ser al menos Object
Ya que ese es el supertipo de todos los tipos. Y por lo tanto, se convierte en el tipo inferido.
1 para la respuesta № 2
?
como un parámetro genérico básicamente significa "cualquier clase" y Integer
Definitivamente califica como "cualquier clase", por lo tanto noerror. No hay errores durante la inicialización porque los genéricos no están presentes durante el tiempo de ejecución, por lo que no importa qué tipo de genérico tenga una vez que se compile el código (casi no importa