A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

     集合addAll方法:我已经明确定义了集合只能接收String类型,为何调用addAll方法可以增加其他集合(非String类型),并且其他集合的类型并不是String类型?代码如下,来个大神给补补脑洞。
package list;
import java.util.ArrayList;
import java.util.Collection;
public class Demo1 {
        public static void main(String[] args) {
                Collection<String> collection = new ArrayList<String> ();  //已经明确的定义了collection 这个集合只能接收String类型。
                collection.add("123");
                collection.add("123");
                collection.add("123");
                Collection collection1 = new ArrayList();
                collection1.add(1);
                collection1.add(2);
                collection1.add(3);
                collection.addAll(collection1);                                //为何collection还能接受collection1 ,并且collection1 集合里面的元素全是int类型?
                System.out.println(collection);
                System.out.println(collection.size());
        }
}

5 个回复

倒序浏览
你查看一下API就会发现,add方法的泛型是针对传入的元素,而addAll方法得泛型针对是传入集合内元素的泛。        Collection collection1 = new ArrayList();  //默认相当于:  Collection<Object> collection1 = new ArrayList<Object>();
        collection1.add(1);
        collection1.add(2);
        collection1.add(3);
以上代码执行完,collection1依旧是一个集合对象啊,与里面的元素无关。
此时你执行的collection.addAll( collection1),对照API的格式相当于执行的是collection.addAll( Collection<Object>  collection1),并无不妥啊。
简单的数,你的菱形泛型内限制的是add()方法的,与addAll()无关;addAll()方法的参数是任意集合对象;
你要想保证里面都是int型,你就在 collection1上也加上泛型。
[size=-1] boolean
add(E e)
          确保此 collection 包含指定的元素(可选操作)。
[size=-1] boolean
addAll(Collection<? extends E> c)
          将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。



点评

以上纯手打,求给个支持  发表于 2016-5-16 17:18
回复 使用道具 举报 1 0
li6232876 发表于 2016-5-16 17:17
你查看一下API就会发现,add方法的泛型是针对传入的元素,而addAll方法得泛型针对是传入集合内元素的泛。   ...

嗯,谢谢,现在明白啦
回复 使用道具 举报
集合接口
集合框架定义了一些接口。本节提供了每个接口的概述:
序号        接口描述
1        Collection 接口
允许你使用一组对象,是Collection层次结构的根接口。
2        List 接口
继承于Collection和一个 List实例存储一个有序集合的元素。
3        Set
继承于 Collection,是一个不包含重复元素的集合。
4        SortedSet
继承于Set保存有序的集合。
5        Map
将唯一的键映射到值。
6        Map.Entry
描述在一个Map中的一个元素(键/值对)。是一个Map的内部类。
7        SortedMap
继承于Map,使Key保持在升序排列。
8        Enumeration
这是一个传统的接口和定义的方法,通过它可以枚举(一次获得一个)对象集合中的元素。这个传统接口已被迭代器取代。
回复 使用道具 举报
li6232876 发表于 2016-5-16 17:17
你查看一下API就会发现,add方法的泛型是针对传入的元素,而addAll方法得泛型针对是传入集合内元素的泛。   ...

放你娘的臭狗屁
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马