cannot resolve construtor 'ArrayList(java.util.Collction<java.lang.String>)'

来源:互联网 发布:windows net命令详解 编辑:程序博客网 时间:2024/06/08 00:03

这里写图片描述

错误分析

从错误信息可以看出是ArrayList这个构造方法出现问题。

  1. ArrayList中存放的是User类型的元素,而红色波浪线报错的地方有个关键提示:java.lang.String.,根据这个为线索,继续分析java.Lang.String是怎么出现的?

  2. java.Lang.String是属于java.util.Collection的泛型,就是说Collection这个集合中存放的是String类型的元素。疑问:

    1. 为什么Collection中存放的是String类型的对象,并没有定义啊?
    2. 错误信息中的java.util.Collection是怎么出现的?
    3. ArrayList的构造函数中传入的是Collection类型的接口是什么意思?ArrayList构造函数是怎么定义的?

解决疑问:

1. db_users.values()返回的是Collection<V>类型。2. Collection<V>是Map<K,V>中的value类型,根据我的代码可知我的value是String类型,所以导致Collection的泛型指定的是String类型。3. ArrayList构造函数的三种定义方法:

这里写图片描述

第一种:构造一个初始容量为10的空列表第三种:构造一个指定初始容量的空列表第二种:构造一个含有指定collection的元素的列表。      此列表中的元素的类型是Collection所指定的泛型String类型,String类型是由Map<K,V>的value类型所决定。      而ArrayList中存放的是User类型的元素,所以不相符合。这就是错误的源头所在。所以,出现这种错误是由于构造函数语法错误。需要传入参数类型是User,而实际传入的类型是String

错误信息结合生活例子

这种错误好比在中国消费用现金有两种方式:一种用人民币,一种是用银圆(相当于ArrayList构造函数有三种方法,只能穿入人民币或者银圆,其他银币不受理)。当你支付日本的日元,泰国的泰铢,澳大利亚的澳元,韩国的韩元,美国的美元,瑞士的瑞郎,欧洲的欧元,俄罗斯的卢布等等现金(相当于java.util.Collction指定的泛型是String类型),即当你给中国人强制传入非人民币和银圆时,中国人是cannot resolve的。

错误解决

Map<K,V>中的V的类型修改为User类型

正确代码

    private Map<Integer, User> db_users = Collections.synchronizedMap(new HashMap<Integer,User>());    public List<User> getUsers() {        List<User> users = new ArrayList<User>(db_users.values());        return users;    }

总结

对于集合中引用泛型List<E> list = new ArrayList(Collection<? extends E> collection)List中指定的泛型必须与想要存在List中的元素类型一致Collection<<? extends E>本人认为是?extend object的意思,而?就是存放在Collection集合中的元素,也是想要存放在List中的元素,所以此元素要想存放在List中,就必须与List指定泛型<E> 一致笼统的讲就是List中的<E> = Collection 中的<?>
阅读全文
0 0
原创粉丝点击