让我们假设模拟Option//来自Scala的实现Some。None简化的基础很简单:
sealed class Option<out A> {
abstract fun isDefined(): Boolean
abstract fun get(): A
}
class Some<A>(val value: A) : Option<A>() {
override fun isDefined(): Boolean = true
override fun get(): A = value
}
object None : Option<Nothing>() {
override fun isDefined(): Boolean = false
override fun get(): Nothing = throw NoSuchElementException()
}
但是怎么添加getOrElse呢?选项:
abstract fun getOrElse(elseBody: () -> A): A- 不能因为Type parameter A is declared as 'out' but occurs in 'in' position in type () -> Aabstract fun <B>getOrElse(elseBody: () -> B): B- 这是可能的,因为None它有效(override fun <B>getOrElse(elseBody: () -> B): B = elseBody()),但因为它是Some不可能写override fun <B>getOrElse(elseBody: () -> B): B = value的。明显value不会打字B
不知何故,有必要在摘要的定义中getOrElse连接A和B,但不是连接 ,而是B : A相反的方向。
在 Scala 中,所谓的。下限:final def getOrElse[B >: A](default: => B): B,但是如何在 Kotlin 中模拟或模拟下限?