📜  java 泛型 - Java (1)

📅  最后修改于: 2023-12-03 14:42:19.345000             🧑  作者: Mango

Java 泛型 - Java

在 Java 中,泛型(Generics)是一种类型安全和重用代码的机制。通过使用泛型,可以在编译时检查类型,并在运行时避免类型转换错误。

为什么要使用泛型

在早期版本的 Java 中,集合类(如List、Set)只能存储 Object 类型的对象。这导致在使用集合时需要手动进行类型转换,这样容易引发类型转换错误,并且在编译时无法检测到错误。

使用泛型可以解决这个问题,它允许我们在定义集合类时指定集合中元素的类型,并且在编译时进行类型检查。这样可以提高代码的可读性和可维护性。

泛型的基本用法
1. 定义泛型类

通过在类名后加上尖括号和类型参数,可以定义一个泛型类。

public class MyClass<T> {
    private T value;
    
    public MyClass(T value) {
        this.value = value;
    }
    
    public T getValue() {
        return value;
    }
}

在上面的例子中,类名后面的 <T> 表示该类是一个泛型类,T 是类型参数。value 成员变量的类型和构造方法的参数类型都是 T,表示根据实例化时传入的类型确定。

2. 使用泛型类

在使用泛型类时,可以通过指定类型参数的实际类型来创建对象。

MyClass<String> myObject = new MyClass<>("Hello");
String value = myObject.getValue();

在上面的例子中,我们创建了一个 MyClass 对象,将类型参数指定为 String。之后就可以使用 String 类型的方法了。

3. 泛型方法

除了可以定义泛型类,还可以定义泛型方法。泛型方法是在方法声明中使用类型参数的方法。

public <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

在上面的例子中,printArray 方法的类型参数是 <T>,表示它是一个泛型方法。方法的参数是一个泛型数组 T[],可以接受任意类型的数组。在方法内部可以按类型参数 T 处理数组的元素。

4. 通配符

有时候,我们希望泛型类或泛型方法能够接受多种类型的参数,可以使用通配符。

上界通配符

上界通配符用 extends 关键字表示,表示类型参数必须是指定类型的子类或本身。

public void printList(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}

在上面的例子中,printList 方法接受一个 List,该列表的元素类型必须是 Number 或其子类。

下界通配符

下界通配符用 super 关键字表示,表示类型参数必须是指定类型的父类或本身。

public void addToList(List<? super Integer> list) {
    list.add(10);
}

在上面的例子中,addToList 方法接受一个 List,该列表的元素类型必须是 Integer 或其父类。通过使用 add 方法将整数添加到列表中。

总结

泛型是 Java 中一个重要的特性,它提供了类型安全和代码重用的机制。通过定义泛型类和泛型方法,我们可以根据实际需求指定类型参数,并且在编译时进行类型检查。同时,通配符的使用可以进一步扩展泛型的灵活性。

参考链接:Java 泛型