generics - 可以改变数组到 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?这只是学术上的好奇心。
解决方案
这看起来不太漂亮,但您可以执行以下操作
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))
推荐阅读
- android - 如何在高度约束文本小部件中获取字符串的最后一个合适的单词?
- vue.js - 在 Vue 模板中存储对象
- android - ADB 无法在 Android 11 上启动 IMAGE_CAPTURE 意图活动
- datetime - x 轴上的日期 - OCTAVE
- javascript - FullCalendar 5 - eventDrop 第一次无法编辑事件道具?
- python - Django 石墨烯,按对象过滤
- powerbi - DAX 创建带有附加字段的日历表
- flutter - SlidingUpPanel 中的 ListView 滚动
- python - 使用参数作为变量的一部分
- javascript - 适配一个 jQuery 函数来发送文件