Java泛型

1. 泛型的基本概念

定义泛型类和泛型方法

泛型类

public class Box<T> {
    private T t;

    public void set(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}

在上面的例子中,T 是类型参数,它将在实例化 Box 类时被具体化。\

泛型方法

public class Util {
    public static <T> void printArray(T[] inputArray) {
        for (T element : inputArray) {
            System.out.printf("%s ", element);
        }
        System.out.println();
    }
}

在这里,<T> 表示该方法是泛型方法,T 可以是任何类型。

2. 使用泛型

泛型类的使用

Box<Integer> integerBox = new Box<>();
integerBox.set(10);
Integer someInteger = integerBox.get();
System.out.println(someInteger); // 输出:10

泛型方法的使用

Integer[] intArray = {1, 2, 3, 4, 5};
Util.printArray(intArray); // 输出:1 2 3 4 5 

String[] stringArray = {"Hello", "World"};
Util.printArray(stringArray); // 输出:Hello World

3. 泛型的高级特性

限定通配符

上界通配符:使用 extends 关键字

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

下界通配符:使用 super 关键字

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

类型擦除

Java 的泛型是通过类型擦除来实现的,这意味着在编译时,泛型信息被移除,所有的泛型参数类型被替换为其边界或 Object(如果没有指定边界)。这保证了向后兼容性,但也带来了一些限制

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

泛型和数组

由于类型擦除的存在,Java 不支持创建泛型数组:

// 不合法的语法
List<Integer>[] arrayOfLists = new List<Integer>[2];

4. 常见问题

泛型类型参数的实例化

由于类型擦除,不能直接实例化泛型类型参数:

public class Box<T> {
    private T t;

    public Box() {
        // t = new T(); // 错误:无法实例化泛型类型
    }
}

静态上下文中的泛型类型参数

静态方法和静态变量不能引用类的类型参数:

public class Box<T> {
    private static T t; // 错误:无法在静态上下文中使用泛型类型参数
}

文章作者: 知行合一
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 知行合一
java
喜欢就支持一下吧