标准库中的 Kotlin 重载解析歧义

Kotlin overload resolution ambiguity in the standard library

在 Kotlin 0.12.1230 中,似乎已弃用的 API 正在阻止使用它们的替代品。

例如,编译器会抱怨以下代码片段,因为它 "cannot choose among... candidates without completing type inference"

val seq = sequenceOf("1")
val first = seq.firstOrNull()

候选人是 Sequence<T>.firstOrNullStream<T>.firstOrNull,两者具有相同的签名并且 Sequence<T> 扩展 Stream<T>。此外,Stream<T> 已弃用,取而代之的是 Sequence<T>.

尝试解决类型推断歧义(如下所示)会导致编译器抱怨 "overload resolution ambiguity"。

val seq = sequenceOf("1")
val first = seq.firstOrNull<String?>()

在我们等待弃用的 API 完全消失时,有什么方法可以解决歧义吗?

似乎转换为最不具体的类型,在本例中为已弃用的类型 Stream<T>,可以实现它,但现在我的代码明确依赖于已弃用的类型,而我不想这样做:

val seq = sequenceOf("1")
val first = (seq as Stream<String>).firstOrNull()

希望有更好的方法?

这似乎是由我的类路径中 Kotlin stdlib 的多个冲突版本引起的(由 Gradle IntelliJ 集成中的长期缺陷引起)。一旦解决了版本冲突,编译器就不再报错了。