10

阅读关于SAM Conversions的 Java 互操作文档,我期望 Kotlin 函数

Collections.sortWith(comparator: kotlin.Comparator<in T> /* = java.util.Comparator<in T> */)

能够在不需要显式指定参数的情况下采用 lambda 函数是 Comparator。但是,以下代码给出type inference failed

val someNumbers = arrayListOf(1, 5, 2)
someNumbers.sortWith({ x, y -> 1 })

然而:

val someNumbers = arrayListOf(1, 5, 2)
someNumbers.sortWith(Comparator { x, y -> 1 })

编译并正确运行

4

1 回答 1

6

在阅读了Kotlin 问题“用于 Kotlin 类的 SAM”的评论后,我学到了很多关于 SAM 转换以及typealias引入原因的知识,但还不知道为什么这个特定行为还没有解决......而且我不是唯一一个该问题及其评论显示。

总而言之,SAM 转换仅考虑用于 Java 接口(也比较此评论)。Jetbrains 确实进行了(或仍需要进行)更大的重构,并尝试解决该问题,以便 SAM 也可用于 Kotlin 函数本身(也可比较此评论)。他们试图在一个单独的问题中支持 kotlin 函数的 SAM 转换,这可能与 1.3 一起提供。因为我目前正在测试 1.3:我还没有看到任何关于此的内容。因此,也许,如果您像我一样喜欢 SAM 转换,您可能想要支持 Kotlin 类的 SAM或kotlin 函数的 SAM 转换,或两者兼而有之。

顺便说一句:Ilya Gorbunov 也使用了一个非常相似的例子,使用arrayOf().sort.

于 2018-09-12T12:21:32.150 回答