Kotlin中用initialCapacity初始化ArrayList时报函数匹配错误
问题根因
该编译错误的核心原因是调用ArrayList构造函数时错误使用了不存在的命名参数initialCapacity。
报错信息中列出的第三个重载(p0: Int)就是接收初始容量的构造函数,传入的容量数值本身逻辑是正确的,但由于Kotlin对Java映射的ArrayList类的这个构造函数,没有暴露可调用的initialCapacity命名参数,编译器无法完成参数匹配,因此抛出参数不匹配的提示。
这类问题属于常见的语法混淆,大多是把Kotlin顶层集合工厂函数的命名参数规则,和Java映射类的构造函数调用规则搞混导致的。
修复方案
- 移除错误的命名参数,按位置传入容量值,同时显式指定ArrayList的泛型类型为
Boolean,避免类型推断异常:
将原代码行itemStates[index] = ArrayList(initialCapacity = capacity)修改为:itemStates[index] = ArrayList<Boolean>(capacity) - 如果习惯使用命名参数的写法,可以改用Kotlin提供的顶层集合工厂函数
mutableListOf,该函数原生支持initialCapacity命名参数,对应写法为:
该方法的底层返回实现同样是Java的itemStates[index] = mutableListOf<Boolean>(initialCapacity = capacity)ArrayList,和直接调用构造函数的运行效果完全一致。
修正后完整参考代码
internal class MyAdapter(private var itemList: List<Items>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() { private var itemStates: MutableMap<Int, ArrayList<Boolean>> = mutableMapOf() init { itemList.forEachIndexed { index, itemObject -> val capacity = if(itemObject.getItemTYPE() == Item.ITEM_TYPE.FOOD) 3 else 5 itemStates[index] = ArrayList<Boolean>(capacity) } } }
内容的提问来源于stack exchange,提问作者XavierCodster
相关产品推荐
相关产品推荐

