Las matrices de Java genérico: ¿Por qué esta compilación y ¿qué significa esto?

Srthkl23:

Java no permite la creación de matrices genéricas directamente. Entiendo que debido a Erasure tipo genérico no se conoce en tiempo de ejecución, mientras que array requiere la comprobación de tipos en tiempo de ejecución y por lo tanto los dos son incompatibles.

Esta pieza de código no compila -

Holder<Integer>[] integers = new Holder<Integer>[5];

Bien, pero no estoy seguro de por qué esta pieza de código compilar realidad (con la advertencia de conversiones de tipos no seguros)?

Holder<Integer>[] holders = new Holder[5];
holders[0] = new Holder<Integer>(5);
holders[1] = new Holder<Integer>(5);
holders[2] = new Holder<Integer>(5);

No entiendo exactamente lo que hizo que en realidad engañar al compilador mediante la eliminación de soportes en diamantes. ¿Es esta una aceptable para crear matrices genéricas?

Además, cuando agrego esta línea al código - holders[3] = new Holder<String>("Hello");Se lanza un error de compilación Holder<String> can not be converted to Holder<Integer>que encontrar este extraño porque por lo que yo entiendo la idea de no permitir que las matrices genéricas se debía a que las matrices no podían diferenciar entre 2 tipos genéricos diferentes, debido a la supresión de tipo . Sin embargo, en este ejemplo, el compilador puede detectar las conversiones de tipos incorrectos.

¿Que me estoy perdiendo aqui?

barredora:

En esta página , usted puede ver exactamente por qué no se permite la creación de matrices de tipos genéricos:

Object[] stringLists = new List<String>[];  // compiler error, but pretend it's allowed
stringLists[0] = new ArrayList<String>();   // OK
stringLists[1] = new ArrayList<Integer>();  // An ArrayStoreException should be thrown,
                                            // but the runtime can't detect it.

stringLists debe solamente ser capaz de almacenar List<String>, pero utilizando el código anterior, que no sólo puede engañar al compilador, sino también el tiempo de ejecución, en lo que me permite almacenar una ArrayList<Integer>en stringLists, debido al tipo de borrado.

pero no estoy seguro por qué esta pieza de código compilar realidad

Bueno, porque Holderes un tipo de prima . Vemos ¿Qué es un tipo de prima y por qué no deberíamos usarlo? . No hay ningún problema, por lo que el compilador y el tiempo de ejecución se refiere, para crear una matriz de un tipo de crudo, ya que aquí no está diciendo que "esta matriz sólo puede almacenar Holder<Integer>", se le acaba diciendo "esta matriz sólo puede almacenar Holder(de cualquier cosa)".

¿Es esta una aceptable para crear matrices genéricas?

Bueno, la matriz no es técnicamente genérico. Puedo asignarlo a una Holder[]y asignar una Holder<Foo>a uno de sus elementos, y no se producirán errores de excepción o compilador. En lo que se refiere al compilador, esto es "aceptable", pero porque se pierde seguridad de tipos, no recomiendo que lo utilice. Debe utilizar algo así como ArrayList<Holder<Integer>>su lugar.

Me parece extraño, porque por lo que yo entiendo la idea de no permitir que las matrices genéricas se debía a que las matrices no podían diferenciar entre 2 tipos genéricos diferentes, debido a la supresión tipo. Sin embargo, en este ejemplo, el compilador puede detectar las conversiones de tipos incorrectos.

El compilador puede detectar si no fuera porque la matriz no permite que usted ponga en Holder<String>, sino porque compilación de tipos en tiempo de la variable es Holder<Integer>[]. El compilador todavía puede comprobar el tipo examinado los tipos de tiempo de compilación, pero tan pronto como se pierde el tipo de tiempo de compilación (asignarlo a una variable de tipo Object[]o Holder[]), entonces no puede hacerlo por usted. La propia matriz permite que cualquier tipo de Holder, en primer lugar de todos modos, porque es una Holder[].

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=229867&siteId=1
Recomendado
Clasificación