在 Java 中使用萬用字元時,應該遵循哪些指導原則?


除了泛型中的型別引數 (T) 之外,還可以使用“?”表示未知型別。您可以將萬用字元用作:

  • 引數型別。
  • 欄位。
  • 區域性欄位。

萬用字元的唯一限制是,在呼叫泛型方法時,不能將其用作泛型方法的型別引數。

Java 提供三種類型的萬用字元:上界萬用字元、下界萬用字元和無界萬用字元。Java 中有兩種型別的萬用字元:

  • 上界萬用字元 - 上界萬用字元類似於泛型中的有界型別。使用它可以啟用將特定類的所有子型別用作型別引數。

    例如,如果希望將 Collection 物件作為方法的引數,其型別引數為 Number 類的子類,則只需要宣告一個以 Number 類為上界的萬用字元。

  • 下界萬用字元 - 同樣,如果使用下界萬用字元,可以將“?”的型別限制為特定型別或其超型別。

  • 例如,如果希望將 Collection 物件作為方法的引數,其型別引數為 Integer 類的超類,則只需要宣告一個以 Integer 類為下界的萬用字元。

使用指南

在 Java 中使用萬用字元時,需要記住以下幾點。

  • 如果您的(方法)有一個獲取資料(從中讀取資料)的變數,則需要使用上界萬用字元 (extends) 定義它。

  • 如果您的(方法)有一個儲存資料(向其中寫入資料)的變數,則需要使用下界萬用字元 (super) 定義它。

  • 如果您的(方法)需要使用獲取資料的變數來呼叫 Object 類的的方法,在這種情況下,需要使用無界萬用字元。

  • 如果您的(方法)需要同時使用讀取和儲存資料的變數,則不需要使用萬用字元。

示例

線上演示

import java.util.ArrayList;
import java.util.List;
   class Person {
   String name;
   Person(String name) {
      this.name = name;
   }
   public String toString() {
      return name;
   }
}
class Employee extends Person {
   Employee(String name) {
      super(name);
   }
}
class NonTeachingStaff extends Employee {
   NonTeachingStaff(String name) {
      super(name);
   }
}
class Student extends Person {
   Student(String name) {
      super(name);
   }
}
public class WildCardGuidelines {
   //Upper bound wildcard
   //in category
   public static void deleteEmp(List<? extends Employee> empList, Employee emp) {
      empList.remove(emp);
      System.out.println("emp Removed");
   }
   //Lower bound wildcard
   //out category
   public static void addEmp(List<? super NonTeachingStaff> empList) {
      empList.add(new NonTeachingStaff("nts"));
      System.out.println("emp 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<Person> personList= new ArrayList<Person>();
      List<NonTeachingStaff> ntsList= new ArrayList<NonTeachingStaff>();
      addEmp(personList);
      addEmp(ntsList);
      addEmp(ntsList);
      //print all data
      printAll(personList);
      printAll(ntsList);
      Employee emp = ntsList.get(0);
      deleteEmp(ntsList, emp);
      printAll(ntsList);
   }
}

輸出

emp Added
emp Added
emp Added
nts
nts
nts
emp Removed
nts

更新於:2019年9月12日

114 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.