标准库中的 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>.firstOrNull
和 Stream<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 集成中的长期缺陷引起)。一旦解决了版本冲突,编译器就不再报错了。
在 Kotlin 0.12.1230 中,似乎已弃用的 API 正在阻止使用它们的替代品。
例如,编译器会抱怨以下代码片段,因为它 "cannot choose among... candidates without completing type inference"
val seq = sequenceOf("1")
val first = seq.firstOrNull()
候选人是 Sequence<T>.firstOrNull
和 Stream<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 集成中的长期缺陷引起)。一旦解决了版本冲突,编译器就不再报错了。