在 Java 中使用通配符时应遵循哪些准则?
java 8object oriented programmingprogramming更新于 2025/11/20 19:56:17
除了泛型中的类型参数 (T),您还可以使用"?"来表示未知类型。您可以将通配符用作减号。
- 参数类型。
- 字段。
- 本地字段。
通配符的唯一限制是,在调用泛型方法时,您不能将其作为类型参数。
Java 提供了三种类型的通配符,分别是上界通配符、下界通配符和无界通配符。Java 中有两种类型的通配符 减号。
上界通配符减号通配符的上限类似于泛型中的有界类型。使用通配符,您可以将特定类的所有子类型用作类型化参数。
例如,如果要接受 Collection 对象作为方法的参数,而该方法的类型化参数是 Number 类的子类,则只需声明一个以 Number 类为上限的通配符即可。
下限通配符 − 类似地,如果我们使用下限通配符,则可以限制"?"的类型。指向特定类型或其超类型。
例如,如果要接受 Collection 对象作为方法的参数,并且该参数的类型为 Integer 类的超类,则只需声明一个通配符,并以 Integer 类为下限。
需要遵循的准则
在 Java 中使用通配符时,需要牢记以下几点。
如果您(您的方法)有一个获取数据的变量(您从中读取数据),则需要使用上限通配符(extends)来定义它。
如果您(您的方法)有一个保存数据的变量(您从中读取数据),则需要使用下限通配符(super)来定义它。
如果您(您的方法)需要调用对象类使用获取数据的变量,在这种情况下,您需要使用无界通配符。
如果您(您的方法)需要同时使用读取和存储数据的变量,则无需使用通配符。
示例
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 {
//上限通配符
//类别内
public static void deleteEmp(List<? extends Employee> empList, Employee emp) {
empList.remove(emp);
System.out.println(&"emp Removed");
}
//下限通配符
//类别外
public static void addEmp(List<? super NonTeachingStaff> empList) {
empList.add(new NonTeachingStaff( nts"));
System.out.println( empAdded");
}
//无限制通配符
//使用 Object 方法 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);
//打印所有数据
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

