Blog
Blog copied to clipboard
Java 泛型
Java 泛型
标签(空格分隔): Java
逆变和协变记不住,始终分不清,记录一下个人理解,方便回忆。
Java的泛型是不变的。
按照继承的理解来看
List list = new ArrayList();
没有问题,父类的特性,子类也有。
推测以下代码应该是合法的
List<Object> list = new ArrayList<String> ();
但是这样会导致一个问题
List<String> tmp = new ArrayList<String> ();
List<Object> list = tmp;
list.add(new Object());
tmp.get(0); //这里无法保证取出的对象是String
要解决这个问题,编译的时候就有足够的信息判断这里不合法,所以编译的时候直接不允许这么写,错误发现的越早越好。
所以List<Object> list = new ArrayList<String> ();
不允许通过编译。
为了API的使用更加灵活,使用通配符来表示一下容器信息吧。
/**
* 我能保证从List里取出的对象都有Object的属性
* 但是你要把Object(String的父类对象)放进去就会出乱子
*/
List<String> raw = new ArrayList<String>();
List<? extends Object> list = raw; //只保证取出来的都有Object的属性,往这个List里面添加新的对象的时候没有足够信息判断是否合法,干脆整个不允许往这个List添加。
raw.get(index); //这里需要保证取出来的是String
/**
* 我能保证这个容器肯定能存放String及其子类
* 但是我不能保证取出来的都是String(Object的子类对象)
*/
List<Object> raw = new ArrayList<Object>();
List<? super String> list = raw; //只保证String能放进去,但是这个List里面有什么东西,缺乏信息,干脆整个不允许从这个List往外读。
list.add("");
raw.add(new Object()); //这里需要保证Object对象能存进去
Href
- https://fashare2015.github.io/2018/05/10/talk-about-generics-from-java-to-kotlin[Java]/?utm_source=tuicool&utm_medium=referral