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

时间:2017-12-06 23:03:50

标签: generics properties kotlin inline

根据我在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的元素类型的类型检查,对吗?关于什么可行的其他答案/想法?

1 个答案:

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

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