我想定義一個Option型別,然后偽多型地定義一個getOrNull操作。
sealed interface Option<out T>
data class Some<out T>(val value: T): Option<T>
object None: Option<Nothing>
fun <T> Option<T>.getOrNull(): T? = when (this) {
is Some<T> -> getOrNull()
is None -> getOrNull()
}
fun <T> Some<T>.getOrNull(): T = value
fun None.getOrNull(): Nothing? = null
這一切都很好。
Option(null)但是,如果我通過指定來收緊泛型型別以禁止T: Any
fun <T: Any> Option<T>.getOrNull(): T? = when (this) {
is Some<T> -> getOrNull()
is None -> getOrNull()
}
然后我得到
Kotlin: Overload resolution ambiguity:
public fun <T : Any> Option<TypeVariable(T)>.getOrNull(): TypeVariable(T)? defined in root package in file Delme.kt
public fun <T> Some<TypeVariable(T)>.getOrNull(): TypeVariable(T) defined in root package in file Delme.kt
為線is Some<T> -> getOrNull()
如何告訴編譯器它應該呼叫兩個子類擴展函式中的哪一個?
uj5u.com熱心網友回復:
問題是,當你限制 T ofOption<T>.getOrNull但不是 the Tof 時,Some<T>.getOrNull你會消除一個比另一個更具體的事實(一個子型別)。現在,它們只是“不同”,因此解析度不明確(編譯器不能再按特異性“排序”它們)。
您也可以通過以下約束來解決Some<T>.getOrNull它Any:
fun <T : Any> Some<T>.getOrNull(): T = value
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510474.html
標籤:科特林仿制药
上一篇:Kotlin密封類
