首页 文章

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

提问于
浏览
1

根据我在an earlier question中收到的建议,我使用"aliases"缩短了一些常用的外部函数(我无法控制)的名称 . 这对扩展功能起到了很好的作用;但是,我还有一些我想要别名的顶级函数 . 有关简化示例,请考虑 generateSequence 函数 . 我希望能够这样做:

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

...但我不能,因为通用必须在接收器类型中使用,如in this answer所述 . 有没有其他方法来创建 alias for a top-level function (requiring generics) which preserves the inline?

EDIT: 我在发布问题后尝试使用 Any? 和星形投影,但我仍然不是一个很好的答案:

inline val seq:(()->Any?)->Sequence<*> get() = ::generateSequence

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

1 回答

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

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

相关问题