面试题答案
一键面试- 能否直接传入:
- 可以将
List<IntegerSub>
和List<DoubleSub>
作为参数传入void processList(List<? extends Number> list)
方法。因为IntegerSub
是Integer
的子类,Integer
是Number
的子类,DoubleSub
是Double
的子类,Double
是Number
的子类,满足? extends Number
的类型限定。
- 可以将
- 方法内部操作注意事项:
- 由于使用了通配符
? extends Number
,在方法内部不能向列表中添加元素(除了null
)。因为编译器无法确定具体的类型,添加非null
元素可能会导致类型不匹配错误。例如:
void processList(List<? extends Number> list) { // list.add(new Integer(1)); // 编译错误 list.add(null); // 可以 }
- 但是可以从列表中读取元素,并且返回的元素类型是
Number
。例如:
void processList(List<? extends Number> list) { for (Number num : list) { double result = num.doubleValue(); System.out.println(result); } }
- 由于使用了通配符
- 修改方法签名以支持添加元素并保证类型安全:
- 可以使用类型参数来代替通配符。例如:
<T extends Number> void processList(List<T> list) { // 现在可以添加T类型的元素 list.add((T) new Integer(1)); // 这里假设T是Integer的子类,实际使用时要根据具体逻辑 for (T num : list) { double result = num.doubleValue(); System.out.println(result); } }
- 这样修改后,在调用该方法时,编译器可以根据传入列表的具体类型来确定
T
的类型,从而保证类型安全,并且可以向列表中添加元素。例如:
List<IntegerSub> intSubList = new ArrayList<>(); processList(intSubList);