加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

聊一聊Java 泛型全解

发布时间:2019-08-29 20:15:00 所属栏目:建站 来源:来一杯82年的Java
导读:副标题#e# 对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。 1、泛型的概述: 1.1 泛型的由来 根据《Java编程思想》中的描述,泛型出现的动机: 有

正确用法:

  1. public static void main(String[] args) { 
  2.  Person<String> person = new Person("sss"); 

PS:编译器会提醒你怎么做的

2.7 高级通配符

2.7.1背景:

2.7.2 上界通配符

上界通配符顾名思义,表示的是类型的上界【包含自身】,因此通配的参数化类型可能是T或T的子类。

正因为无法确定具体的类型是什么,add方法受限(可以添加null,因为null表示任何类型),但可以从列表中获取元素后赋值给父类型。如上图中的第一个例子,第三个add()操作会受限,原因在于List和List是List的子类型。

它表示集合中的所有元素都是Animal类型或者其子类 List

这就是所谓的上限通配符,使用关键字extends来实现,实例化时,指定类型实参只能是extends后类型的子类或其本身。

例如:

这样就确定集合中元素的类型,虽然不确定具体的类型,但最起码知道其父类。然后进行其他操作。

  1. 它表示集合中的所有元素都是Animal类型或者其子类 
  2.  List<? extends Animal> 

2.7.3 下界通配符

下界通配符表示的是参数化类型是T的超类型(包含自身),层层至上,直至Object

编译器无从判断get()返回的对象的类型是什么,因此get()方法受限。但是可以进行add()方法,add()方法可以添加T类型和T类型的子类型,如第二个例子中首先添加了一个Cat类型对象,然后添加了两个Cat子类类型的对象,这种方法是可行的,但是如果添加一个Animal类型的对象,显然将继承的关系弄反了,是不可行的。

它表示集合中的所有元素都是Cat类型或者其父类 List

这就是所谓的下限通配符,使用关键字super来实现,实例化时,指定类型实参只能是extends后类型的子类或其本身

例如

  1. //Animal是其父类 
  2. List<? super Cat> list = new ArrayList<Animal>(); 

2.7.4 无界通配符

任意类型,如果没有明确,那么就是Object以及任意的Java类了

无界通配符用表示,?代表了任何的一种类型,能代表任何一种类型的只有null(Object本身也算是一种类型,但却不能代表任何一种类型,所以List和List的含义是不同的,前者类型是Object,也就是继承树的最上层,而后者的类型完全是未知的)

3、泛型擦除

3.1 概念

编译器编译带类型说明的集合时会去掉类型信息

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读