根据我在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的元素类型的类型检查,对吗?关于什么可行的其他答案/想法?
答案 0 :(得分:2)
您可以使用的选项是重命名导入,但它仅限于单个源文件:
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)
实际上,我希望此选项的性能优于带有函数引用的性能,因为当您调用该引用时,使用返回函数引用的内联属性仍会有一些开销,虽然这个调用是内联的,因此不应该为另一个嵌套调用引入任何开销。