Java中的泛型是如何使用的

小樊
82
2024-09-14 11:02:01

在Java中,泛型(Generics)是一種編程語(yǔ)言特性,允許你在類(lèi)、接口和方法上定義類(lèi)型參數(shù)。泛型的主要目標(biāo)是提高Java語(yǔ)言的類(lèi)型安全和消除頻繁的類(lèi)型轉(zhuǎn)換。通過(guò)使用泛型,程序員可以在編譯時(shí)捕獲更多的錯(cuò)誤,而不是等到運(yùn)行時(shí)。

以下是Java中泛型的基本用法:

  1. 定義泛型類(lèi)或接口:
public class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

這里,Box 是一個(gè)泛型類(lèi),T 是一個(gè)類(lèi)型參數(shù)。你可以為 T 傳遞任何類(lèi)型,例如 IntegerString 等。

  1. 使用泛型類(lèi)或接口:
Box<Integer> integerBox = new Box<>();
integerBox.setItem(42);
System.out.println(integerBox.getItem()); // 輸出 42

Box<String> stringBox = new Box<>();
stringBox.setItem("Hello, world!");
System.out.println(stringBox.getItem()); // 輸出 Hello, world!
  1. 定義泛型方法:
public static <T> T getFirstElement(List<T> list) {
    if (list == null || list.isEmpty()) {
        return null;
    }
    return list.get(0);
}

這里,getFirstElement 是一個(gè)泛型方法,它接受一個(gè) List<T> 類(lèi)型的參數(shù),并返回一個(gè) T 類(lèi)型的值。

  1. 使用泛型方法:
List<Integer> integers = Arrays.asList(1, 2, 3);
Integer firstInteger = getFirstElement(integers);
System.out.println(firstInteger); // 輸出 1

List<String> strings = Arrays.asList("a", "b", "c");
String firstString = getFirstElement(strings);
System.out.println(firstString); // 輸出 a
  1. 泛型通配符:

通配符 ? 可以用于表示未知類(lèi)型。這在處理泛型類(lèi)型的集合時(shí)非常有用。例如,你可以創(chuàng)建一個(gè) List<?> 來(lái)表示包含任意類(lèi)型對(duì)象的列表。

List<Integer> integerList = Arrays.asList(1, 2, 3);
List<String> stringList = Arrays.asList("a", "b", "c");

printList(integerList);
printList(stringList);

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

這里,printList 方法接受一個(gè) List<?> 類(lèi)型的參數(shù),它可以接受任何類(lèi)型的列表。注意,由于通配符表示未知類(lèi)型,因此你不能將元素添加到這樣的列表中(除了 null),因?yàn)槟銦o(wú)法確定哪些類(lèi)型是允許的。

  1. 有界泛型:

有時(shí),你可能希望限制泛型類(lèi)型參數(shù)的范圍。例如,你可能只想允許 Number 類(lèi)及其子類(lèi)作為類(lèi)型參數(shù)。這可以通過(guò)使用有界泛型來(lái)實(shí)現(xiàn):

public class NumericBox<T extends Number> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

這里,T extends Number 表示 T 必須是 Number 類(lèi)或其子類(lèi)的類(lèi)型。

這就是Java中泛型的基本用法。通過(guò)使用泛型,你可以編寫(xiě)更加靈活、可重用和類(lèi)型安全的代碼。

0