《Effective Java 02》--泛型Collection(? extends E)和Collection(? super E)
阿新 • • 發佈:2018-12-16
一, 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>來進行相關的型別處理;