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

博客分析了在Java编程中遇到的'cannot resolve construtor 'ArrayList(java.util.Collction<java.lang.String>)''错误,解释了错误的原因是尝试使用错误类型的参数调用ArrayList构造函数。通过生活实例比喻,帮助理解为何不能将特定类型(如java.util.Collection的String子类型)传递给ArrayList的构造函数。最后,博客提供了问题的解决办法和正确的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

错误分析

从错误信息可以看出是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 中的<?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值