首页 > 解决方案 > 可以改变数组到 IntArray、FloatArray、CharArray ...ECT,在 Kotlin 中自动使用 Generic?

问题描述

我是 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()))
  }
}

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

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

但是代码不起作用。原因是如果我将相同类型的因子放入 varag 参数中,它会被转换为IntArray, FloatArray, LongArray, and CharArray,这被识别为与TypedArray( Array<T>) 不同的类型。

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

标签: genericskotlinfunctional-programming

解决方案


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

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))

推荐阅读