首頁 >Java >java教程 >Java 泛型方法與通配符的使用有何不同?

Java 泛型方法與通配符的使用有何不同?

WBOY
WBOY原創
2024-05-02 11:51:021253瀏覽

泛型方法具有型別參數,指定可操作的資料型別。通配符表示未知類型,上限通配符指定類型是給定類型的子類別或本身,下限通配符指定類型是父類別或本身。

Java 泛型方法与通配符的使用有何区别?

Java 泛型方法與通配符的差異

引言

泛型在Java 中是一種強大的工具,可讓開發人員建立可重複使用的程式碼,而不必擔心資料類型的不相容性。泛型方法和通配符是兩種機制,可以進一步增強泛型的能力。本文將探討它們的不同之處,並透過實戰案例展示如何使用它們。

泛型方法

泛型方法是具有型別參數的方法。類型參數指定了方法可以使用的資料類型。例如,以下泛型方法可以操作任意型別的清單:

public static <T> void printList(List<T> list) {
    for (T item : list) {
        System.out.print(item + " ");
    }
    System.out.println();
}

可以透過使用方法時指定型別參數來呼叫泛型方法:

List<String> names = new ArrayList<>();
names.add("John");
names.add("Mary");

printList(names); // 输出:John Mary

通配符

通配符是用來表示未知類型的特殊語法。它們通常用於建立泛型的上限或下限。

  • 上限通配符(? extends T)表示未知型別是 T 型別的子類別或 T 本身。
  • 下限通配符(? super T)表示未知類型是 T 類型的父類別或 T 本身。

例如,以下泛型方法使用上限通配符來取得清單中所有物件的超類別:

public static <T> List<Class<?>> getSuperclasses(List<? extends T> list) {
    List<Class<?>> superclasses = new ArrayList<>();
    for (T item : list) {
        superclasses.add(item.getClass().getSuperclass());
    }
    return superclasses;
}

實戰案例

考慮以下案例:我們有一個實作了Animal 介面的動物類,並且希望有一個方法來列印動物列表。

泛型方法

我們可以建立一個泛型方法來列印任何類型的Animal:

public static <T extends Animal> void printAnimals(List<T> animals) {
    for (T animal : animals) {
        System.out.println(animal.getName());
    }
}

通配符

我們也可以使用通配符來表示Animal 的任何子類別:

public static void printAnimals(List<? extends Animal> animals) { // 使用上限通配符
    for (Animal animal : animals) { // 使用上限通配符
        System.out.println(animal.getName());
    }
}

在這兩種情況下,我們都可以使用單一方法來列印不同類型的動物清單。然而,泛型方法提供了類型安全,因為它強制類型參數繼承 Animal 接口,而通配符不提供這種保證。

以上是Java 泛型方法與通配符的使用有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn