[Aprende JAVA desde cero | Artículo 25] Genéricos

Tabla de contenido

Prefacio:

Genéricos:

Extensiones adicionales:

Resumir:


Prefacio:

        Este artículo presentará en detalle los genéricos de los que hemos estado hablando en JAVA anteriormente. Los estudiantes interesados ​​pueden hacer clic para ver.

Genéricos:

        Generics es un concepto de programación que permite el uso de parámetros de tipo al definir una clase, interfaz o método, de modo que se pueda especificar el tipo real en el momento del uso. Mediante el uso de genéricos, puede crear código reutilizable y con seguridad de tipos al mismo tiempo que aumenta la flexibilidad y la legibilidad de su código.

        El objetivo principal de los genéricos es proporcionar verificación de tipos en tiempo de compilación para garantizar la coherencia y la seguridad de los tipos. Permite usar el mismo código en diferentes escenarios sin escribir una implementación separada para cada tipo. El código genérico se borra a su forma no genérica en tiempo de ejecución, un mecanismo conocido como borrado de tipo.

        En Java, los genéricos usan corchetes angulares (<>) para especificar parámetros de tipo. Por ejemplo, puede definir una clase genérica List<E>, donde E es un parámetro de tipo que representa el tipo de elementos de la lista. Use List<String> para crear una lista de tipos de cadenas y List<Integer> para crear una lista de tipos enteros. Ambos son instancias de la misma clase genérica, pero con diferentes tipos de elementos.

        Los genéricos también se pueden utilizar para definir métodos e interfaces. El uso de parámetros genéricos en un método permite que el método funcione con diferentes tipos de datos sin tener que escribir un método diferente para cada tipo de datos. Los parámetros genéricos en una interfaz pueden especificar un tipo específico al implementar la interfaz.

Ventajas de los genéricos:
1. Seguridad de tipo: el compilador puede comprobar los errores de tipo en tiempo de compilación para evitar excepciones de conversión de tipo en tiempo de ejecución.
2. Reutilización de código: es posible escribir código de propósito general para diferentes tipos de datos.
3. Legibilidad y mantenibilidad: el código genérico es más fácil de entender y mantener porque la información de tipo se puede especificar en el momento de la definición.

De hecho, la aparición de los genéricos unifica los elementos almacenados en la colección, si no se utilizan genéricos, cuando añadimos elementos a la colección, podemos añadir varios elementos: números, cadenas, etc., pero los genéricos estandarizan los tipos almacenados en cadenas.

Notas sobre el uso de genéricos:

1. Los genéricos no pueden escribir tipos de datos básicos. (explicado a continuación)

2. Después de especificar el tipo básico del tipo genérico, al transferir datos, puede pasar el tipo de clase o su tipo de subclase

2. Si no escribe genéricos, el tipo predeterminado es clase de objeto (de hecho, también es clase de objeto al final, como se explica a continuación)

Ingrese datos en una colección sin usar genéricos:

import java.util.ArrayList;
import java.util.Iterator;

public class test {
    public static void main(String[] args) {

        ArrayList list=new ArrayList();

        list.add(123);
        list.add("abc");
        list.add(1.2);

        //遍历集合中的每一个元素
        Iterator it = list.iterator();
        while(it.hasNext())
        {
            Object element =  it.next();
            System.out.println(element);
        }
    }
}

resultado de la operación:

Sin usar genéricos, todos los datos son de tipo Objeto. En este momento, se puede agregar cualquier tipo de datos a la colección, pero la desventaja es que no podemos llamar al comportamiento único de este tipo. Si queremos forzar la llamada, debemos usar conversión de tipo, y la conversión de tipo puede traer errores inesperados.

Use genéricos para ingresar datos en colecciones:

import java.util.ArrayList;
import java.util.Iterator;

public class test {
    public static void main(String[] args) {

        ArrayList<Integer> list=new ArrayList<>();

        list.add(113);
        list.add(125);
        list.add(133);

        //遍历集合中的每一个元素
        Iterator <Integer>it = list.iterator();
        while(it.hasNext())
        {
           int em=it.next();
            System.out.println(em);
        }
    }
}

resultado de la operación:

 Podemos ver que después de usar genéricos, nuestros elementos de entrada solo pueden ser del tipo especificado, y no necesitamos el tipo de objeto para recibir el valor de retorno de next, solo usamos el tipo int directamente, lo que significa que podemos llamar directamente a este tipo de método.

Extensiones adicionales:

Pero, de hecho, los genéricos en JAVA son pseudogenéricos. 

        Los genéricos de Java brindan la función de verificación de tipo en tiempo de compilación, pero el borrado de tipo se realizará en tiempo de ejecución, es decir, la información de tipo del tipo genérico se borra al tipo original (tipo sin procesar).

        En Java, los genéricos son un mecanismo para realizar la verificación de tipos en tiempo de compilación. Al usar genéricos, puede usar parámetros de tipo al definir clases, interfaces y métodos, y especificar tipos específicos cuando los usa. Esto aumenta la seguridad de tipo de su código y reduce la posibilidad de errores de tipo en tiempo de ejecución.

        Sin embargo, el mecanismo genérico en Java en realidad se implementa a través del borrado de tipos. En el momento de la compilación, el compilador verificará el tipo genérico para garantizar la consistencia del tipo. Pero en el código de bytes generado, la información del tipo genérico se borra y todos los tipos genéricos se reemplazan con sus tipos originales.

Debido a la existencia del borrado de tipos, existen algunas restricciones y casos especiales:
1. Los tipos básicos no se pueden usar como parámetros de tipo, solo se pueden usar sus clases contenedoras correspondientes. Por ejemplo, no puede usar el tipo primitivo int, pero necesita usar Integer.
2. El parámetro de tipo real del genérico no se puede obtener en tiempo de ejecución. Por ejemplo, no hay forma de determinar el tipo parametrizado real de un tipo genérico utilizando el operador instanceof o mediante la reflexión.
3. El tipo genérico específico no se puede almacenar en la colección, solo se puede almacenar su tipo original. Por ejemplo, no puede crear un ArrayList<int>, solo un ArrayList<Integer>.

Este mecanismo de borrado de tipo genérico se denomina "pseudogenérico" porque la información de tipo de los genéricos no está disponible en tiempo de ejecución. Sin embargo, el mecanismo genérico de Java aún proporciona verificación de tipo en tiempo de compilación, reduce la aparición de errores de tipo y mejora la legibilidad y la capacidad de mantenimiento del código.

En resumen, "los genéricos en Java son pseudo-genéricos" significa que los genéricos de Java proporcionan verificación de tipo en tiempo de compilación, pero en tiempo de ejecución la información de tipo se borra, dejando solo tipos primitivos. A pesar de algunas limitaciones y casos especiales, los genéricos son un mecanismo de programación útil.

De hecho, estas palabras se pueden resumir de la siguiente manera: aunque los genéricos especifican el tipo de datos al ingresar datos en la matriz, cuando estos datos se transfieren a bytecode, el tipo de datos se borrará y se convertirá en tipo de objeto. A este patrón lo llamamos pseudogenérico.

Resumir:

        Genéricos es un concepto muy práctico, estandariza el tipo de datos y facilita nuestro uso, por lo tanto, debemos dominar el concepto de genéricos, también explicaremos en detalle otras aplicaciones de los genéricos más adelante.

Si mi contenido es útil para ti, dale me gusta, comenta y marca . ¡La creación no es fácil, el apoyo de todos es mi motivación para perseverar!

Supongo que te gusta

Origin blog.csdn.net/fckbb/article/details/131460745
Recomendado
Clasificación