Java泛型通配符使用指南

通配符有三種使用方式 -

  • 上限通配符 - ? extends擴展類型。
  • 下限通配符 - ? super超級類型。
  • 無限通配符 - ?

要確定哪種類型的通配符最適合條件,我們首先將傳遞給方法的參數類型作爲inout參數進行分類。

  • in變量 - in變量爲代碼提供數據。例如,copy(src,dest)。 這裏src作爲要複製的數據的變量。
  • out變量 - out變量保存由代碼更新的數據。例如,copy(src,dest)。 這裏的dest作爲具有複製數據的變量。

通配符指南

  • 上限通配符 - 如果變量屬於類別,請使用帶有通配符的extends關鍵字。
  • 下界通配符 - 如果一個變量是外部類別,請使用帶有通配符的super關鍵字。
  • 無界通配符 - 如果可以使用Object類方法訪問變量,則使用未綁定的通配符。
  • 無通配符 - 如果代碼訪問進/出類別中的變量,那麼不要使用通配符。

示例

以下示例說明了上述概念。

使用您喜歡的編輯器創建以下java程序,並保存到文件:GuidelinesForWildcardUse.java 中,代碼如下所示 -

package com.yiibai.demo;

import java.util.ArrayList;
import java.util.List;

public class GuidelinesForWildcardUse {

    // Upper bound wildcard
    // in category
    public static void deleteCat(List<? extends Cat> catList, Cat cat) {
        catList.remove(cat);
        System.out.println("Cat Removed");
    }

    // Lower bound wildcard
    // out category
    public static void addCat(List<? super RedCat> catList) {
        catList.add(new RedCat("Red Cat"));
        System.out.println("Cat Added");
    }

    // Unbounded wildcard
    // Using Object method toString()
    public static void printAll(List<?> list) {
        for (Object item : list)
            System.out.println(item + " ");
    }

    public static void main(String[] args) {

        List<Animal> animalList = new ArrayList<Animal>();
        List<RedCat> redCatList = new ArrayList<RedCat>();

        // add list of super class Animal of Cat class
        addCat(animalList);
        // add list of Cat class
        addCat(redCatList);
        addCat(redCatList);

        // print all animals
        printAll(animalList);
        printAll(redCatList);

        Cat cat = redCatList.get(0);
        // delete cat
        deleteCat(redCatList, cat);
        printAll(redCatList);
    }
}

class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }
}

class Cat extends Animal {
    Cat(String name) {
        super(name);
    }
}

class RedCat extends Cat {
    RedCat(String name) {
        super(name);
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }
}

執行上面代碼,得到以下結果 -

Cat Added
Cat Added
Cat Added
Red Cat 
Red Cat 
Red Cat 
Cat Removed
Red Cat