一.
现在要说应用,查看一下API中的注释,
这里有一个方法addAll里面有extedns E,我们看一下这个方法什么时候用。下面这三个集合,有存储person,student,还有worker的。
再接下来演示一下这个高级应用,如果我们要去想定义一下集合的话,(描述一下集合)
这个类里面加入的元素不确定的情况下,写的是个E,明确什么类型,add方法中添加的也是什么类型。一次添加一个元素比较慢,addAll方法可以添加一堆元素,
一般情况下,就是这么写。(addAll又将mycollection加入挺奇怪的,没看懂) 里面装什么类型(里面是指开头class后面泛型里的类型),我再添加新集合的时候,这集合也是什么类型(API中对于这个方法是有描述的,将一个集合添加进入某一个集合中)。为什么呢?
现在又有一个集合al4,往里面装的是string类型,不再一次添加一个元素,采用addAll方法直接将string集合添加进来。这里是不行的,规定了mycollection<E>中类型一致,这里的al4和al1中不是同一个类型。
如果不加泛型限定,能不能添加进来?如下图所示,将所有的泛型去掉。是可以的,为什么?
因为没有指定泛型,就是object,反正都是对象都可以往里面放。下面例子中,输出的元素的个数为3,有两个person对象,还有一个字符串对象。取得时候会出问题。
现在解释,为什么class开头和里面定义得方法都要同时是E的原因,要是类型不匹配,我明确的是person,但是往里面放的是字符串,取的时候转成字符串还是person是不清楚的,就会出事,会有安全隐患。
上面的例子就是一个集合中规定了类型是person,如果有其它集合中的元素想要存入该集合中,必须要保证类型一致,不然编译时会出错,或者开发平台会提示你出错。
经过一段时间,person产生了一些子类对象,比如说worker就是al2,现在想要将al2放进来。这是可以的,为什么呢?输出ptint.size的结果是四个,取得时候是按照person类型来取,因为al2是放置到al1中了,取得时候自然是按照al1来取得。person是可以接收student的,mycolleciton这个方法可以接收新集合中存储E类型元素的,也可以是E类型的子类的,因为取没有问题。
取的时候不存在类型安全隐患,addAll方法扩展性很强,按理说写个E就可以了,现在扩展了子类来了也是可以的。
什么时候用这个呢?存储的时候,用的都是上限。这里的存储可能是说的class开头的mycollection的位置。
元素是对象,上限是类型,