泛型集合的添加与获取

  1. List<? extends A>
    除了null,无法添加其他对象,可以通过A或Object定义向上转型来读取
public class Fanxing {

	public static void main(String[] args) {
		List<? extends A> extendsList = new ArrayList<>();
		/**
         * 编译错误,因为编译器如果允许添加A1,那么必须允许添加A2,因为A1和A2都是其子类型, 
         * 这样就出现了可以添加多种类型的情况,所以所有子类型都不允许添加
         */
		extendsList.add(new A1());
		// 编译错误,集合的定义是A子类型的集合,A是确切的类型,也无法进行向下转型
		extendsList.add(new A());
		extendsList.add(null);
		// 根据向上转型,可以读取
		A extendsA = extendsList.get(0);
		Object extendsB = extendsList.get(0);
	}

	public static class Parent {}
	public static class A extends Parent {}
	public static class A1 extends A {}
	public static class A2 extends A {}
}
  1. List<? super A>
    除了null和A,无法添加其他对象,可以通过Object向上转型或强制转换来读取
package gittest.fanxing;

import java.util.ArrayList;
import java.util.List;

public class Fanxing {

	public static void main(String[] args) {
		
		List<? super A> superList = new ArrayList<>();
		/**
            * 编译错误,因为编译器如果允许添加Parent,那么必须允许添加Object,因为Parent和Object都是其父类型, 
            * 这样就出现了可以添加多种类型的情况,所以所有父类型都是不允许添加的
            */
		superList.add(new Parent());
		superList.add(new Object());
		// 编译通过,因为无论A的父类型是啥,A都是可以通过向上转型,这符合集合的定义
		superList.add(new A());
		superList.add(null);
		A superA = (A) superList.get(0);
		Object superB = superList.get(0);
	}

	public static class Parent {}
	public static class A extends Parent {}
	public static class A1 extends A {}
	public static class A2 extends A {}
}
  1. 泛型集合强转
    只有 ? extend/super 才能被强转,强转为边界或满足边界限定条件的类型
public class Fanxing {

	public static void main(String[] args) {
		
		List<? extends Parent> extendParentlist = new ArrayList<>();
		List<Parent> parentList = (List<Parent>) extendParentlist;
       //编译错误,object并不是Parent子类
		List<Object> extendObjectList=(List<Object>)extendParentlist;
		
		List<? extends Object> extendObjectlist = new ArrayList<>();
		parentList = (List<Parent>) extendObjectlist;

		List<? super Parent> superParentList = new ArrayList<>();
		parentList = (List<Parent>) superParentList;
		List<Object> superObjectList=(List<Object>)superParentList;

		List<Object> objectList = new ArrayList<>();
        //编译错误
		parentList = (List<Parent>) objectList;

	}

	public static class Parent {}
	public static class A extends Parent {}
	public static class A1 extends A {}
	public static class A2 extends A {}
}
  1. 总结
    • ?extends/super 泛型集合主要用在方法参数的定义上,以便更宽泛的集合入参
    • ?extends/super 作为方法参数时,能传入的参数类型和强转规则一样
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值