返回

java进阶篇01:泛型宝典,从初识到精通

Android

Java泛型进阶

在Java编程中,泛型是用于创建类型安全集合和算法的强大工具。泛型允许开发者定义可以使用多种类型数据的类和方法,而无需为每种类型创建一个单独的类或方法。在本文中,我们将探讨Java泛型的进阶使用和规则,包括方法参数通配符的使用规则以及创建泛型对象时使用通配符的使用规则,帮助您从初识到精通Java泛型。

一、方法参数通配符的使用规则

1. 通配符概述

通配符是Java中用于表示任何类型的特殊符号。在泛型中,通配符可以用于方法参数和创建泛型对象。方法参数通配符允许方法接受任何类型的数据作为参数,而无需指定具体的类型。

2. 无界通配符

无界通配符(?)表示可以接受任何类型的数据作为参数。例如,以下方法接受任何类型的数据作为参数:

public static void printList(List<?> list) {
    for (Object item : list) {
        System.out.println(item);
    }
}

3. 上界通配符

上界通配符(<? extends T>)表示可以接受任何类型的数据作为参数,但该类型必须是T或T的子类。例如,以下方法接受任何类型的数据作为参数,但该类型必须是Animal或Animal的子类:

public static void printAnimalList(List<? extends Animal> list) {
    for (Animal animal : list) {
        System.out.println(animal);
    }
}

4. 下界通配符

下界通配符(<? super T>)表示可以接受任何类型的数据作为参数,但该类型必须是T或T的超类。例如,以下方法接受任何类型的数据作为参数,但该类型必须是Object或Object的超类:

public static void printObjectList(List<? super Object> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}

二、创建泛型对象时使用通配符的使用规则

1. 无界通配符

无界通配符(?)可以用于创建任何类型数据的泛型对象。例如,以下代码创建了一个可以存储任何类型数据的List对象:

List<?> list = new ArrayList<>();

2. 上界通配符

上界通配符(<? extends T>)可以用于创建可以存储T或T的子类数据的泛型对象。例如,以下代码创建了一个可以存储Animal或Animal的子类数据的List对象:

List<? extends Animal> list = new ArrayList<Animal>();

3. 下界通配符

下界通配符(<? super T>)可以用于创建可以存储T或T的超类数据的泛型对象。例如,以下代码创建了一个可以存储Object或Object的超类数据的List对象:

List<? super Object> list = new ArrayList<Object>();

三、泛型使用中的注意事项

1. 泛型类型擦除

在Java中,泛型类型会在编译时被擦除。这意味着,在运行时,泛型类型信息将丢失。因此,在使用泛型时,需要特别注意以下几点:

  • 不能在泛型类或方法中使用类型参数作为数组的元素类型。
  • 不能在泛型类或方法中使用类型参数作为实例变量的类型。
  • 不能在泛型类或方法中使用类型参数作为方法参数的类型。

2. 泛型与继承

当泛型类或方法被继承时,子类可以继承父类的泛型类型参数。但是,子类不能改变父类的泛型类型参数。例如,以下代码将导致编译错误:

public class Parent<T> {
    private T value;

    public T getValue() {
        return value;
    }
}

public class Child<E extends Number> extends Parent<E> {
    @Override
    public E getValue() {
        return super.getValue();
    }
}

在上面的代码中,子类Child试图改变父类Parent的泛型类型参数T为E。但是,这是不允许的。

结语

通过本文的学习,您应该已经对Java泛