Java泛型是一种强类型约束机制,可以在编译时检查类型安全,防止类型转换错误。通配符是Java泛型的一个重要特性,可以帮助我们更灵活地使用泛型。
泛型通配符是一种特殊的类型参数,用于表示一个未知的类型。Java泛型通配符有两种形式:?
和? extends T
。其中,?
表示任何类型,? extends T
表示T或T的子类。
泛型通配符可以用作方法的参数类型,这样可以接受任何类型的参数。
public static void printList(List<?> list) {
for (Object elem : list) {
System.out.print(elem + " ");
}
System.out.println();
}
在这个例子中,List>
表示可以接受任何类型的List
,?
是一个通配符,表示未知类型。
泛型通配符还可以用作方法的返回类型,这样可以返回任何类型的对象。
public static <T> T getFirst(List<? extends T> list) {
if (list.isEmpty()) {
return null;
}
return list.get(0);
}
在这个例子中,List extends T>
表示可以接受任何类型的List
,并返回一个T
类型的对象。? extends T
表示T
或T
的子类。
泛型通配符还可以限制其上界,这样可以接受指定范围内的类型。
public static void printNumbers(List<? extends Number> list) {
for (Number num : list) {
System.out.print(num + " ");
}
System.out.println();
}
在这个例子中,List extends Number>
表示可以接受任何继承自Number
类的List
。
泛型通配符还可以限制其下界,这样可以接受指定范围内的类型。
public static void addNumbers(List<? super Integer> list) {
list.add(1);
list.add(2);
list.add(3);
}
在这个例子中,List super Integer>
表示可以接受任何Integer
的超类的List
。
使用泛型通配符时,需要注意以下几点:
下面是一个完整的示例代码,演示了泛型通配符的使用。
import java.util.ArrayList;
import java.util.List;
public class GenericsDemo {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("hello");
stringList.add("world");
stringList.add("!");
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(2);
integerList.add(3);
// 使用无限制的通配符
printList(stringList);
printList(integerList);
// 使用有限制的通配符
printNumbers(integerList);
// 使用有限制的通配符
List<Number> numberList = new ArrayList<>();
addNumbers(numberList);
printList(numberList);
}
public static void printList(List<?> list) {
for (Object elem : list) {
System.out.print(elem + " ");
}
System.out.println();
}
public static void printNumbers(List<? extends Number> list) {
for (Number num : list) {
System.out.print(num + "");
}
System.out.println();
}
public static void addNumbers(List<? super Integer> list) {
list.add(1);
list.add(2);
list.add(3);
}
}
在这个示例代码中,我们定义了三个方法,分别使用了无限制的通配符、有限制的通配符和有限制的下界通配符。在main
方法中,我们创建了一个String
类型的List
和一个Integer
类型的List
,并分别调用这三个方法进行测试。
泛型通配符是Java泛型的一个重要特性,可以帮助我们更灵活地使用泛型。使用泛型通配符时,需要注意其上下界限制,以提高类型的安全性。在实际编程中,我们可以根据具体情况选择使用无限制的通配符、有限制的通配符或有限制的下界通配符。