以下示例在 Kotlin 1.3.21 中完全合法:
fun <T> foo(bar: T): T = bar
val t: Int = foo(1) // No need to declare foo<Int>(1) explicitly
但为什么类型推断不适用于高阶函数?
fun <T> foo() = fun(bar: T): T = bar
val t: Int = foo()(1) // Compile error: Type inference failed...
当使用高阶函数时,Kotlin 强制调用站点为:
val t = foo<Int>()(1)
即使显式指定了foo
的返回类型,类型推断仍然失败:
fun <T> foo(): (T) -> T = fun(bar: T): T = bar
val t: Int = foo()(1) // Compile error: Type inference failed...
但是,当泛型类型参数与外部函数共享时,它可以工作!
fun <T> foo(baz: T) = fun (bar: T): T = bar
val t: Int = foo(1)(1) // Horray! But I want to write foo()(1) instead...
如何编写函数 foo
以便 foo()(1)
编译,其中 bar
是泛型类型?
最佳答案
我不是类型推断如何工作的专家,但基本规则是:在使用时,编译器必须知道正在使用的表达式中的所有类型。
所以我的理解是:
foo() <- 在这里使用类型信息
foo()(1) <- 在此处提供信息
看起来类型推断不能“向后”工作
val foo = foo<Int>()//create function
val bar = foo(1)//call function
关于kotlin - 具有通用返回类型的高阶函数的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54799122/