1. 程式人生 > >《Effective Java 02》--泛型Collection(? extends E)和Collection(? super E)

《Effective Java 02》--泛型Collection(? extends E)和Collection(? super E)

一, 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>來進行相關的型別處理;