gpt4 book ai didi

generics - 包含泛型的Kotlin函数的内联别名?

转载 作者:行者123 更新时间:2023-12-02 13:23:36 25 4
gpt4 key购买 nike

根据在an earlier question中收到的建议,我用“别名”缩写了一些常用的外部函数(我不控制)的名称。这对于扩展功能非常有效。但是,我也想使用一些顶级函数作为别名。对于简化示例,请考虑generateSequence函数。我希望能够做到这一点:

// DOES NOT COMPILE
inline val <T:Any> seq:(()->T?)->Sequence<T> get() = ::generateSequence

...但是我不能,因为必须在接收器类型中使用泛型,如 in this answer所述。还有其他方法可以为保留内联的顶级函数(需要泛型)创建 别名吗?

编辑:我在发布问题后立即尝试使用 Any?和星投影,但我仍然认为这不是一个好答案:
inline val seq:(()->Any?)->Sequence<*> get() = ::generateSequence

这似乎是boptimalsu,因为它损害了Sequence元素类型的类型检查,对吗?关于什么可行的其他答案/想法?

最佳答案

您可以使用的选项是重命名导入,尽管它仅限于单个源文件:

import kotlin.sequences.generateSequence as seq

fun main(args: Array<String>) {
seq(1) { it + 1 }.take(10).forEach(::println)
}

除此之外,我认为,最好的办法是退回声明另一个内联函数:
inline fun <T> seq(nextFunction: () -> T?) = 
generateSequence(nextFunction)

实际上,我希望此选项的性能会优于带有函数引用的选项,因为使用内联属性返回函数引用在调用该引用时仍然会产生一些开销,而此调用是内联的,因此不会为另一个嵌套调用带来任何开销。

关于generics - 包含泛型的Kotlin函数的内联别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47684968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com