📜  Java泛型教程(1)

📅  最后修改于: 2023-12-03 15:02:05.114000             🧑  作者: Mango

Java泛型教程

简介

Java泛型是Java语言中一种强大的编程技术,用于在编译期对数据类型进行检查和处理。泛型使得程序员可以编写通用的代码,适用于多种数据类型,并避免了运行期错误。

泛型类

泛型类是一种拥有一个或多个类型变量的类。类型变量规定了这个类可以作用于哪些数据类型。

public class Box<T> {
    private T t;

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

    public T get() {
        return t;
    }
}

Box<Integer> box = new Box<Integer>();
box.set(10);
System.out.println(box.get());

在上面的例子中,Box类使用了一个类型变量T,表示一个占位符,可以代表任意类型。Box类可以被实例化为Box<Integer>类型的对象,其中类型变量T被类型Integer所代替。

泛型方法

泛型方法是一种可以在调用时指定类型的方法,可以在不同数据类型之间进行转换。

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

Integer[] intArray = {1, 2, 3, 4, 5};
String[] strArray = {"Hello", "World"};

printArray(intArray);
printArray(strArray);

在上面的例子中,printArray是一个泛型方法,可以接受任意类型的数组作为参数,并将数组元素输出到控制台。

泛型接口

泛型接口是一种接口,使用类型变量作为泛型类型参数。

public interface List<T> {
    void add(T t);
    T get(int index);
}

public class ArrayList<T> implements List<T> {
    private T[] array;
    private int size;

    public ArrayList() {
        array = (T[]) new Object[10];
        size = 0;
    }

    public void add(T t) {
        if (size >= array.length) {
            T[] newArray = (T[]) new Object[array.length * 2];
            System.arraycopy(array, 0, newArray, 0, array.length);
            array = newArray;
        }
        array[size++] = t;
    }

    public T get(int index) {
        return array[index];
    }
}

在上面的例子中,List接口定义了一个泛型类型T,并提供了两个方法:add和get。ArrayList类实现了List接口,并使用类型变量T作为存储数据的类型。

通配符

通配符是一种表示任意类型的占位符,可以应用于泛型类、泛型方法和泛型接口中。

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

List<Integer> intList = Arrays.asList(1, 2, 3);
List<String> strList = Arrays.asList("Hello", "World");

printList(intList);
printList(strList);

在上面的例子中,printList方法接收一个List类型的参数,但该List的元素类型未知。可以将intList和strList作为参数传递给printList方法,并依次输出其中的元素。

类型推断

Java SE 7及以上版本引入了菱形语法,可以根据左侧的泛型定义来推断右侧的类型参数。

List<String> strList = new ArrayList<>();
strList.add("Hello");
strList.add("World");

for (String str : strList) {
    System.out.println(str);
}

在上面的例子中,使用ArrayList<>来实例化strList,并自动推断类型为String。

类型擦除

Java中的泛型是通过类型擦除实现的,在编译期间进行类型检查,在运行时将泛型类型擦除成原始类型。

public class Box<T> {
    private T t;

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

    public T get() {
        return t;
    }
}

Box<Integer> box = new Box<Integer>();
System.out.println(box.getClass().getName()); // Box

在上面的例子中,使用getClass方法获取box对象的类名时,输出结果为Box,而不是Box<Integer>。这是因为在运行时,泛型类型已经被擦除成原始类型。

总结

Java泛型是一种强大的编程技术,可以帮助程序员编写通用的代码,适用于多种数据类型。学好泛型对于成为一名优秀的Java程序员来说是非常重要的。