/ / Parametrizando LinkedList con '?' en java - java, lista enlazada

Parametrizando LinkedList con '?' en java - java, lista enlazada

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 № 1

En

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