《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>来进行相关的类型处理;

猜你喜欢

转载自blog.csdn.net/weixin_39039342/article/details/84703877