在 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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP