【发布时间】:2020-08-20 08:29:37
【问题描述】:
我正在创建一个通用环形缓冲区,我想使用数组列表作为数据的内部存储,我想分配具有定义 capacity 的数组列表。
这是一个使用 Kotlin ArrayList 的示例:
class RingBuffer<T>(private val capacity: Int) {
private var buffer = ArrayList<T>(initialCapacity = capacity)
}
我编译代码的时候出现这个错误:
Kotlin:以下函数都不能使用提供的参数调用: public final fun(): kotlin.collections.ArrayList /* = java.util.ArrayList / 定义在 kotlin.collections.ArrayList public final fun (p0: (MutableCollection
..Collection = java.util.ArrayList / 在 kotlin.collections 中定义。数组列表 public final fun (p0: Int): kotlin.collections.ArrayList / = java.util.ArrayList */ 定义在 kotlin.collections.ArrayList?)): kotlin.collections.ArrayList /
我尝试过使用 Java ArrayList:
import java.util.ArrayList
class RingBuffer<T>(private val capacity: Int) {
private var buffer = ArrayList<T>(capacity)
}
在这种情况下,代码可以编译,但buffer 有size=0,因此未分配数组。
那么问题是如何创建并分配ArrayList 和default T 值?
【问题讨论】:
-
size与capacity不同。size为 0,因为列表不包含任何内容,但仍应分配底层数组,其容量 =capacity。如果你真的想设置一个默认值,你可以使用MutableList(capacity){ default } -
@gpunto 谢谢。这是作品
var buffer = MutableList<T?>(capacity) { null }。你知道是否可以省略可空性,使其像var buffer = MutableList<T>(capacity) { default(T) }。例如default(T)在 C# 中是可能的,但我不确定 Kotlin 或 Java 中是否有类似的东西? -
你知道 Kotlin 1.4(刚刚发布)adds a new ArrayDeque class 吗?也许这就是你想要的?
-
@gidds 是的,我知道 ArrayDeque。我在 Kotlin 中实现一些数据结构只是为了好玩,以学习语言并了解如何在理想的 Kotlin 中编写东西。
-
@VadimSentiaev 太好了! (但我会留下我的评论,以防其他读者不知道。)