Java泛型基础知识第二部分整理
2017-10-10 23:18
288 查看
在前面泛型的第一部分中,谈到可T不能用于实例化对象,解决这个问题要用到通配符?
博文资料来源于 Java泛型三:通配符详解extends super
一、<? extends T>和<? super T>区别
在Java泛型中,?表示通配符,代表未知类型。< ? extends Object>表示上边界限定通配符,< ? super Object>表示下边界限定通配符。
T:作用于模板上,用于将数据类型进行参数化,不能用于实例化对象。
?:在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义。
< T > 等同于 < T extends Object>
< ? > 等同于 < ? extends Object>
例一:定义泛型类,将key,value的数据类型进行< K, V >参数化,而不可以使用通配符。
public class Container<K, V> {
private K key;
private V value;
public Container(K k, V v) {
key = k;
value = v;
}
例二:实例化泛型对象,我们不能够确定eList存储的数据类型是Integer还是Long,因此我们使用List<? extends Number>定义变量的类型。
List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();
上界类型通配符(? extends)
List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
Number numObject = eList.get(0); //语句1,正确
Integer intObject = eList.get(0); //语句2,错误
eList.add(new Integer(1)); //语句3,错误
语句1:List<? extends Number>eList存放Number及其子类的对象,语句1取出Number(或者Number子类)对象直接赋值给Number类型的变量是符合java规范的。
语句2:List<? extends Number>eList存放Number及其子类的对象,语句2取出Number(或者Number子类)对象直接赋值给Integer类型(Number子类)的变量是不符合java规范的。
语句3:List<? extends Number>eList不能够确定实例化对象的具体类型,因此无法add具体对象至列表中,可能的实例化对象如下。
eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();
eList = new ArrayList<Float>();
总结:上界类型通配符add方法受限,但可以获取列表中的各种类型的数据,并赋值给父类型(extends Number)的引用。因此如果你想从一个数据类型里获取数据,使用 ? extends 通配符。限定通配符总是包括自己。
下界类型通配符(? super )
List<? super Integer> sList = null;
sList = new ArrayList<Number>();
Number numObj = sList.get(0); //语句1,错误
Integer intObj = sList.get(0); //语句2,错误
sList.add(new Integer(1)); //语句3,正确
语句1:List<? super Integer> 无法确定sList中存放的对象的具体类型,因此sList.get获取的值存在不确定性,子类对象的引用无法赋值给兄弟类的引用,父类对象的引用无法赋值给子类的引用,因此语句错误。
语句2:同语句1。
语句3:子类对象的引用可以赋值给父类对象的引用,因此语句正确。
总结:下界类型通配符get方法受限,但可以往列表中添加各种数据类型的对象。因此如果你想把对象写入一个数据结构里,使用 ? super 通配符。限定通配符总是包括自己。
总结
限定通配符总是包括自己
上界类型通配符:add方法受限
下界类型通配符:get方法受限
如果你想从一个数据类型里获取数据,使用 ? extends 通配符
如果你想把对象写入一个数据结构里,使用 ? super 通配符
如果你既想存,又想取,那就别用通配符
不能同时声明泛型通配符上界和下界
博文资料来源于 Java泛型三:通配符详解extends super
一、<? extends T>和<? super T>区别
在Java泛型中,?表示通配符,代表未知类型。< ? extends Object>表示上边界限定通配符,< ? super Object>表示下边界限定通配符。
T:作用于模板上,用于将数据类型进行参数化,不能用于实例化对象。
?:在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义。
< T > 等同于 < T extends Object>
< ? > 等同于 < ? extends Object>
例一:定义泛型类,将key,value的数据类型进行< K, V >参数化,而不可以使用通配符。
public class Container<K, V> {
private K key;
private V value;
public Container(K k, V v) {
key = k;
value = v;
}
例二:实例化泛型对象,我们不能够确定eList存储的数据类型是Integer还是Long,因此我们使用List<? extends Number>定义变量的类型。
List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();
上界类型通配符(? extends)
List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
Number numObject = eList.get(0); //语句1,正确
Integer intObject = eList.get(0); //语句2,错误
eList.add(new Integer(1)); //语句3,错误
语句1:List<? extends Number>eList存放Number及其子类的对象,语句1取出Number(或者Number子类)对象直接赋值给Number类型的变量是符合java规范的。
语句2:List<? extends Number>eList存放Number及其子类的对象,语句2取出Number(或者Number子类)对象直接赋值给Integer类型(Number子类)的变量是不符合java规范的。
语句3:List<? extends Number>eList不能够确定实例化对象的具体类型,因此无法add具体对象至列表中,可能的实例化对象如下。
eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();
eList = new ArrayList<Float>();
总结:上界类型通配符add方法受限,但可以获取列表中的各种类型的数据,并赋值给父类型(extends Number)的引用。因此如果你想从一个数据类型里获取数据,使用 ? extends 通配符。限定通配符总是包括自己。
下界类型通配符(? super )
List<? super Integer> sList = null;
sList = new ArrayList<Number>();
Number numObj = sList.get(0); //语句1,错误
Integer intObj = sList.get(0); //语句2,错误
sList.add(new Integer(1)); //语句3,正确
语句1:List<? super Integer> 无法确定sList中存放的对象的具体类型,因此sList.get获取的值存在不确定性,子类对象的引用无法赋值给兄弟类的引用,父类对象的引用无法赋值给子类的引用,因此语句错误。
语句2:同语句1。
语句3:子类对象的引用可以赋值给父类对象的引用,因此语句正确。
总结:下界类型通配符get方法受限,但可以往列表中添加各种数据类型的对象。因此如果你想把对象写入一个数据结构里,使用 ? super 通配符。限定通配符总是包括自己。
总结
限定通配符总是包括自己
上界类型通配符:add方法受限
下界类型通配符:get方法受限
如果你想从一个数据类型里获取数据,使用 ? extends 通配符
如果你想把对象写入一个数据结构里,使用 ? super 通配符
如果你既想存,又想取,那就别用通配符
不能同时声明泛型通配符上界和下界
相关文章推荐
- java基础知识记录--linux部分(摘自张孝祥整理java面试题)
- 黑马程序员--面向对象第二部分-内部类、异常--java学习日记6(基础知识)
- java基础知识记录--EJB部分(摘自张孝祥整理java面试题)
- Java基础部分知识整理
- Java WEB开发实战 之 第二部分:Web应用基础知识【私塾在线原创】
- java基础知识记录--Java web部分(摘自张孝祥整理java面试题)
- Java泛型基础知识整理第一部分
- java基础知识记录--XML部分(摘自张孝祥整理java面试题)
- Java基础知识➣泛型整理(四)
- java基础知识记录--Java web部分(摘自张孝祥整理java面试题)
- java基础知识记录--webservice部分(摘自张孝祥整理java面试题)
- JAVA基础知识整理(七) ---数据库
- java基础知识部分知识点
- java学习知识整理 2 泛型
- java 基础知识整理归纳2
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
- Java培训实战教程之Java基础知识精华部分(六)-继承
- java基础知识整理
- headFirst java学习笔记之一:基础知识部分(5.7)
- 再探java基础——零碎基础知识整理