java generic array how simulate generic arrays java
Este tutorial explica cómo simular la funcionalidad de Generic Array en Java usando Object Array y también usando Reflection Class con un ejemplo simple:
Ya hemos discutido Genéricos de Java en uno de nuestros tutoriales anteriores. Java permite clases, métodos, etc. genéricos que pueden declararse independientes de los tipos. Sin embargo, Java no permite que la matriz sea genérica.
La razón de esto es que en Java, los arreglos contienen información relacionada con sus componentes y esta información se usa para asignar memoria en tiempo de ejecución. Cuando se utilizan genéricos, debido al borrado de tipo, el código de bytes no contiene ninguna información genérica.
=> Visite aquí para aprender Java desde cero.
Lo que vas a aprender:
Matriz genérica en Java
Si ha definido una matriz genérica, el tipo de componente no se conocerá en tiempo de ejecución. Por tanto, no es recomendable definir matrices como genéricas en Java.
Una definición de matriz genérica se muestra a continuación:
|_+_|El compilador no conoce el tipo exacto del que se va a crear una instancia, ya que la información del tipo no está disponible en tiempo de ejecución.
Entonces, en lugar de matrices, siempre que se requieran genéricos, debe preferir el componente de lista del marco de colecciones de Java. Sin embargo, puede crear estructuras genéricas que sean similares a una matriz utilizando la matriz de objetos y la función de reflexión de Java.
Estos dos enfoques que nos permiten definir matrices de diferentes tipos de datos se explican a continuación en detalle.
es la clave de red igual que la contraseña
Crear e inicializar la matriz genérica
En esta sección, creemos una estructura similar a una matriz que es de naturaleza genérica. Con estas estructuras, podrá crear matrices proporcionando el tipo de datos como argumento.
Usando Object Array
Este enfoque utiliza la matriz de objetos de tipo como miembro de la clase de matriz principal. También usamos métodos get / set para leer y configurar los elementos de la matriz. Luego, instanciamos la clase de matriz principal que nos permite proporcionar el tipo de datos según sea necesario.
Esto simula la matriz genérica.
El siguiente programa demuestra el uso de una matriz de objetos para crear una estructura genérica similar a una matriz.
|_+_|Producción:
En el programa anterior, hemos definido una clase Array que es genérica. La matriz de objetos es un miembro de la clase que se instancia mediante un constructor y una longitud. También usamos los métodos genéricos get y set que se usan para leer y establecer un elemento de matriz de un tipo particular.
Luego creamos instancias de esta clase de matriz. Al crear instancias, podemos especificar el tipo deseado. En el programa anterior, hemos creado dos matrices de tipo Integer y String y luego completamos estas matrices con los valores apropiados (usando el método set).
Finalmente, utilizando el método 'toString' anulado, mostramos el contenido de cada una de estas instancias.
Usando Reflection
En este enfoque, usamos una clase de reflexión para crear una matriz genérica cuyo tipo se conocerá solo en tiempo de ejecución.
El enfoque es similar al anterior con solo una diferencia, es decir, usamos la clase de reflexión en el propio constructor para instanciar una matriz de objetos pasando explícitamente la información del tipo de datos al constructor de la clase.
Este tipo de información se pasa al método de reflexión Array.newInstance.
El siguiente programa muestra el uso de la reflexión para crear una matriz genérica . Tenga en cuenta que toda la estructura del programa es similar al enfoque anterior con solo la diferencia en el uso de funciones de reflexión.
|_+_|Producción:
El programa anterior muestra matrices de dos tipos, es decir, Integer y String creadas a partir de la clase genérica Arrays.
Error de creación de matriz genérica
Ya hemos discutido las implicaciones de crear matrices genéricas en Java y por qué no es posible tener matrices genéricas en Java. Otra explicación a esto es que los arreglos en Java son covariantes mientras que los genéricos no lo son. Los genéricos son invariantes.
Por covarianza, queremos decir que se puede asignar una matriz del subtipo a su referencia de supertipo.
Esto significa que la siguiente declaración funcionará bien.
|_+_|Como Integer es un subtipo de Number, la declaración anterior se compila bien.
cómo ver archivos xml en word
Pero si usamos el mismo concepto con genéricos, no funcionará, es decir, con genéricos, no podemos asignar subtipo genérico a un supertipo genérico.
La declaración, ListobjList = new ArrayList (); dará un error de compilación ya que los genéricos no son covariantes como las matrices.
Teniendo en cuenta la razón anterior, no podemos tener algo como a continuación también:
|_+_|Esta declaración no se compilará con el error, 'Creación de matriz genérica' ya que no podemos declarar una matriz de referencias a un tipo genérico específico.
Sin embargo, podemos crear una matriz de referencias a un tipo genérico específico utilizando comodines. La declaración anterior se puede compilar con éxito con un ligero cambio de utilizar un comodín como se muestra a continuación.
|_+_|La declaración anterior se compilará correctamente.
El siguiente programa muestra una demostración del uso de comodines.
diferencia entre el árbol b y el árbol b|_+_|
Producción:
En el programa anterior, tenemos la primera declaración en el método principal que indica la invariancia de los genéricos. Esta declaración mostrará el error de compilación (mostrado en los comentarios). La siguiente creación de la matriz sigue las reglas de los genéricos y, por lo tanto, se compilan correctamente.
Preguntas frecuentes
P # 1) ¿Qué es una matriz genérica?
Responder: Las matrices que son independientes del tipo de datos y cuyo tipo de información se evalúa en tiempo de ejecución son matrices genéricas. Los genéricos son similares a las plantillas en C ++.
P # 2) ¿Puede crear una matriz genérica en Java?
Responder: Las matrices son covariantes en Java, es decir, cualquier matriz de subclase se puede asignar a una matriz de supertipo. Los genéricos, sin embargo, son invariantes, es decir, no puede asignar una matriz de tipo de subclase al tipo de superclase.
En segundo lugar, la información genérica se elimina de JVM y, por lo tanto, la matriz cuya asignación de memoria se realiza en tiempo de ejecución no sabe qué tipo se asignará a la matriz. Por lo tanto, las matrices y los genéricos no van bien juntos en Java.
P # 3) ¿Qué es el Tipo E en Java?
Responder: actúa como marcador de posición para genéricos y representa cualquier tipo de elemento.
P # 4) ¿Qué es el borrado de tipos en Java?
Responder: Un proceso llevado a cabo por el compilador de Java mediante el cual los tipos parametrizados utilizados en genéricos se eliminan y se asignan a tipos sin procesar en código de bytes. Como tal, el código de bytes no contiene información sobre genéricos.
P # 5) ¿Qué es un tipo sin formato en Java?
Responder: Los tipos sin formato son tipos genéricos sin utilizar el parámetro de tipo. P.ej. La lista es un tipo sin formato; mientras que List es un tipo parametrizado.
Conclusión
En Java, la matriz genérica no se puede definir directamente, es decir, no se puede asignar un tipo parametrizado a una referencia de matriz. Sin embargo, si utiliza matrices de objetos y funciones de reflexión, puede simular la creación de matrices genéricas.
Hemos visto estos dos enfoques en este tutorial junto con los detalles del error genérico de creación de matrices y las posibilidades para evitar dicho error. En pocas palabras, en Java, se puede decir que las matrices y los genéricos no van de la mano, ya que las matrices son covariantes mientras que los genéricos son invariantes.
=> Consulte la guía de formación de Java perfecta aquí.
Lectura recomendada
- Matriz de Java: ¿Cómo imprimir elementos de una matriz en Java?
- Tutorial de longitud de matriz de Java con ejemplos de código
- Tutorial de reflexión de Java con ejemplos
- Matriz de Java: declarar, crear e inicializar una matriz en Java
- Introducción a las matrices de Java y conceptos relacionados
- Tutorial de Java Generics con ejemplos
- Tutorial de Java SWING: contenedor, componentes y manejo de eventos
- Tipos de datos, bucles, matrices, conmutadores y aserciones de Java