【问题标题】:Why Can't Kotlin Infer The Type For Comparator为什么 Kotlin 不能推断比较器的类型
【发布时间】:2019-02-16 22:11:42
【问题描述】:

阅读关于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 })

编译并正确运行

【问题讨论】:

  • 有趣的是它适用于Collections.sort(arrayList, { x, y -> 1 })
  • 如果sortWith 宁愿接受comparator: (T, T) -> Int 类型的比较器,它可以在不指定Comparator 的情况下工作...但我现在不知道我应该如何处理这些信息;- ) 这实际上并没有那么大的帮助,因为我们将需要 Collections.sort.(this) { x, y -> comparator(x, y) }sortedWith 中而不是......(我只是在大声思考)
  • 非常有趣的阅读:Kotlin issue #7770 - SAM for Kotlin classes,也许也值得竖起大拇指;-) 另外:#11129 SAM conversion for kotlin function...也许在 1.3 中会有一些东西...虽然还没有看到...

标签: kotlin kotlin-interop


【解决方案1】:

在阅读了来自Kotlin issue 'SAM for Kotlin classes' 的 cmets 之后,我学到了很多关于 SAM 转换以及为什么引入 typealias 的知识,但还不知道为什么这个特定的行为还没有解决......而且我不是唯一一个正如问题及其 cmets 所示。

总而言之,SAM 转换仅考虑用于 Java 接口(也可比较 this comment)。 Jetbrains 确实进行了(或仍需要进行)更大的重构,并尝试解决该问题,以便 SAM 也可用于 Kotlin 函数本身(也可比较 this comment)。他们正在尝试支持SAM conversion for kotlin functions in a separate issue,它可能会随 1.3 一起提供。因为我目前正在测试 1.3:我还没有看到任何关于此的内容。所以也许,如果你像我一样喜欢 SAM 转换,你可能想要投票 SAM for Kotlin classesSAM conversion for kotlin function 或两者兼而有之。

顺便说一句:a very similar example was also used by Ilya Gorbunov using arrayOf().sort

【讨论】:

  • 不错的发现。我最喜欢的部分是“我不得不在我的 kotlin 项目中创建 java 接口,只是因为缺少这个特性。” youtrack.jetbrains.com/issue/… 所以有一个解决方法,至少对你自己的代码来说是这样。
  • 好吧...老实说,我宁愿生活在没有变通办法的情况下;-) 我真的不明白为什么sortWith 使用Comparator-参数,如果我们有“不错的功能类型”...在这种特定情况下,我可能宁愿使用 sort(someNumbers) { x, y -> 1 }Collections.sort-import... 它更短,可读性好,它允许我使用 SAM 转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多