在 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
广告