【问题标题】:Create generic ArrayList with initialCapacity in generic class在泛型类中创建具有 initialCapacity 的泛型 ArrayList
【发布时间】: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?)): kotlin.collections.ArrayList / = java.util.ArrayList / 在 kotlin.collections 中定义。数组列表 public final fun (p0: Int): kotlin.collections.ArrayList / = java.util.ArrayList */ 定义在 kotlin.collections.ArrayList

我尝试过使用 Java ArrayList:

import java.util.ArrayList
class RingBuffer<T>(private val capacity: Int) {
    private var buffer = ArrayList<T>(capacity)
}

在这种情况下,代码可以编译,但buffersize=0,因此未分配数组。

那么问题是如何创建并分配ArrayListdefault T 值?

【问题讨论】:

  • sizecapacity 不同。 size 为 0,因为列表不包含任何内容,但仍应分配底层数组,其容量 = capacity。如果你真的想设置一个默认值,你可以使用MutableList(capacity){ default }
  • @gpunto 谢谢。这是作品var buffer = MutableList&lt;T?&gt;(capacity) { null }。你知道是否可以省略可空性,使其像var buffer = MutableList&lt;T&gt;(capacity) { default(T) }。例如 default(T) 在 C# 中是可能的,但我不确定 Kotlin 或 Java 中是否有类似的东西?
  • 你知道 Kotlin 1.4(刚刚发布)adds a new ArrayDeque class 吗?也许这就是你想要的?
  • @gidds 是的,我知道 ArrayDeque。我在 Kotlin 中实现一些数据结构只是为了好玩,以学习语言并了解如何在理想的 Kotlin 中编写东西。
  • @VadimSentiaev 太好了! (但我会留下我的评论,以防其他读者不知道。)

标签: kotlin generics arraylist


【解决方案1】:

可以这样做:

class RingBuffer<T>(size: Int) {
    private var buffer = MutableList<T?>(size) { null }
}

拥有可以为空的T? 很好,因为read 方法将具有此签名:

fun read(): T?

【讨论】:

  • capacity 在这里是错误的。您使用的参数实际上是size。另外,构造函数的参数不需要是属性(省略private val
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多