一, Collection<? extends E>
需求1: 按顺序将一系列同种类型的元素全部放到堆栈中
public static void main(String[] args) {
FanXing2<Number> fan = new FanXing2<>();
List<Integer> integers = new ArrayList<>();
integers.add(1);
integers.add(3);
integers.add(2);
fan.pushAll(integers);
}
public void pushAll(Collection<E> src) {
Stack<E> stack = new Stack<>();
for (E e : src) {
stack.push(e);
}
System.out.println(stack);
}
此时编译报错, 类型匹配异常:
The method pushAll(Collection<Number>) in the type FanXing2<Number> is not applicable for the arguments (List<Integer>)
对pushAll()方法进行改造:
public void pushAll(Collection<? extends E> src) {
Stack<E> stack = new Stack<>();
for (E e : src) {
stack.push(e);
}
System.out.println(stack);
}
打印结果: [1, 3, 2] 即ok
## Integer是Number的子类, 但是Collection<Integer>不是Collection<Number>的子类, 所以用Collection<? extends E>来进行相关的类型处理;
二, Collection<? super E>
需求2: 按顺序将一系列不同种类型的元素全部放到堆栈中
public static void main(String[] args) {
FanXing2<Number> fan = new FanXing2<>();
List<Object> Objects = new ArrayList<>();
Objects.add(1);
Objects.add("3");
Objects.add("你好");
fan.pushAll(Objects);
}
public void pushAll3(Collection<? super E> src) {
Stack<Object> stack = new Stack<>();
for (Object e : src) {
stack.push(e);
}
System.out.println(stack);
}
## 同理, Number是Object的子类, 但是Collection<Number>不是Collection<Object>的子类, 所以用Collection<? super E>来进行相关的类型处理;