【问题标题】:Can change Array<T> to IntArray, FloatArray, CharArray ...ECT, automatically using Generic in Kotlin?可以在 Kotlin 中使用 Generic 自动将 Array<T> 更改为 IntArray、FloatArray、CharArray ...ECT 吗?
【发布时间】:2020-02-25 15:20:02
【问题描述】:

我是 Kotlin 的初学者,正在学习这本书。

函数式 Kotlin:扩展您的 OOP 技能并在 Kotlin 和 Arrow 中实施函数式技术

本书包含以下代码:

sealed class FunList<out T> {
  object Nil: FunList<Nothing>()
  data class Cons<out T>(val head: T, val tail: FunList<T>): FunList<T>
}

fun initListOf(vararg numbers: Int): FunList<Int> {
  return if (numbers.isEmpty()) {
    Nil
  } else {
    Cons(numbers.first(), initListOf(*numbers.drop(1).toTypedArray().toIntArray()))
  }
}

这是构建数据结构的示例。这是构建数据结构的示例。我想知道我是否可以在initListOf 函数中使用进入FunList 类型的泛型。例如:

fun <T> initListOf(vararg items: T): FunList<T> = if (items.isEmpty()) {
  Nil
} else {
  Cons(items.first(), initListOf(*items.drop(1).toTypedArray())) // error
}

但代码不起作用。 原因是如果我在varag参数中放入相同类型的因子,它被转换为IntArrayFloatArrayLongArrayCharArray,这被识别为与TypedArray不同的类型( Array&lt;T&gt;)。

当我放入相同类型的变量时,如何让它们自动创建相同类型的 FunList? 这只是学术上的好奇心。

【问题讨论】:

    标签: generics kotlin functional-programming


    【解决方案1】:

    在以泛型方式使用可变变量和类型化数组时,它们比列表更难处理,因为它们具有具体类型(没有类型擦除)。因此,您可以使用带有 List 参数的版本来重载您的函数:

    fun <T> initListOf(items: List<T>): FunList<T> = if (items.isEmpty()) {
        Nil
    } else {
        Cons(items.first(), initListOf(items.drop(1)))
    }
    
    fun <T> initListOf(vararg items: T) = initListOf(items.toList())
    

    【讨论】:

    • 顺便说一句,以这种方式递归转换列表看起来像一个非常繁重的操作,如果列表很长,可能会导致堆栈溢出。
    【解决方案2】:

    这看起来不太漂亮,但您可以执行以下操作

    fun <T> initListOf(items: Array<T>): FunList<T> = when {
        items.isEmpty() -> FunList.Nil
        items.size == 1 -> {
            FunList.Cons(items.first(), initListOf(items.copyOf(0) as Array<T>))
        }
        else -> {
            FunList.Cons(items.first(), initListOf(items.copyOfRange(1, items.size)))
        }
    }
    

    然后你可以称它为

    initListOf(arrayOf(1,2,3,4,5))
    

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 2021-09-02
      • 1970-01-01
      • 2019-04-10
      • 2017-02-23
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多