如何声明泛型扩展函数类型?

时间:2019-12-19 01:57:27

标签: function generics kotlin functional-programming

有正常的扩展功能

fun <T> List<T>.test() { }

fun String.test(){ }

我可以声明一个具有扩展函数类型的变量

val obj1 = fun String.(){ }

但不能声明具有通用扩展功能类型的变量

val obj2 = fun <T> List<T>.() {} //error

P.S。我不想使用List<Any>,它与通用名称不同。

有人可以告诉我如何解决吗?谢谢!

2 个答案:

答案 0 :(得分:1)

扩展功能有点像鲱鱼。值根本不能具有多态类型,不仅在Kotlin中,而且在Java,Scala等中也是如此。 根据您想要的为什么,一种方法是返回扩展函数的通用函数:

fun <T> obj2Generic() = fun List<T>.() {}
val obj2ForInt = obj2Generic<Int>()
val obj2ForString = obj2Generic<String>()

答案 1 :(得分:0)

您无法执行此操作,就像无法在不指定类型参数的情况下将常规(非扩展)通用函数分配给变量或实例化通用类一样。尝试让自己陷入困境:此类变量的类型是什么?它也是通用的,因此只有在另一个通用上下文中才有可能。

fun <T> List<T>.test(){ }

val v1 = List::test // No
val v2 = List<String>::test // OK

fun <T> other() {
    val v3 = List<T>::test // OK
    val v4 = fun List<T>.() { } // OK
}