面试题答案
一键面试实现printList方法
import java.util.List;
public class GenericExample {
public static void printList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
}
为什么使用通配符
使用? extends Number
通配符,意味着这个列表可以包含Number
及其任何子类的元素。这样可以保证在方法内部安全地读取列表中的元素,因为我们知道这些元素都是Number
类型或其子类,从而可以执行Number
类定义的操作(如print
)。
? extends Number
和 ? super Number
的区别及适用场景
? extends Number
- 含义:表示类型是
Number
的子类(包括Number
自身)。 - 适用场景:适用于方法主要是从列表中读取数据的场景。例如上述
printList
方法,它只需要读取列表中的元素并打印,不关心具体是Number
的哪个子类,只要是Number
及其子类即可。在这种情况下使用? extends Number
,可以接受任何包含Number
子类元素的列表,增加了方法的通用性。
- 含义:表示类型是
? super Number
- 含义:表示类型是
Number
的超类(包括Number
自身)。 - 适用场景:适用于方法主要是向列表中写入数据的场景。例如,如果有一个方法需要将
Number
及其子类的对象添加到列表中,使用? super Number
可以确保列表的类型能够接受这些对象。例如:
- 含义:表示类型是
import java.util.ArrayList;
import java.util.List;
public class GenericExample {
public static void addNumber(List<? super Number> list, Number num) {
list.add(num);
}
public static void main(String[] args) {
List<Object> objectList = new ArrayList<>();
addNumber(objectList, 10); // 10是Integer,是Number的子类
}
}
在上述addNumber
方法中,使用? super Number
确保了无论列表实际的类型是什么(只要是Number
的超类),都可以安全地将Number
及其子类的对象添加到列表中。如果使用? extends Number
,由于编译器只知道列表元素是Number
的子类,但具体是哪个子类不确定,所以不允许向列表中写入(除了null
),因为可能会违反类型安全。