kotlin - 具有通用返回类型的高阶函数的类型推断

标签 kotlin

以下示例在 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/

相关文章:

android - 当我关闭手机的互联网时,Kotlin 的 URL.readText() 崩溃

functional-programming - Kotlin arrow-kt 展平嵌套的 Either

gradle - Gradle Maven使用kotlin-dsl发布Pom

swing - 如何在 JavaFX 应用程序中显示 OpenCV 网络摄像头捕获帧

android - Kotlin 的 "@Parcelize"是否适用于非数据类?

android - 分类器没有伴随对象,因此必须在这里初始化

initialization - 编写一个在初始化程序中提供自引用的 Kotlin util 函数

android - 通过房间数据库的一对多关系出现问题

android - "can' t find referenced class"with Proguard and Kotlin

java - 如何在 jackson 中编写自定义属性反序列化器