Kotlin和具有协方差的上部类型界

mon*_*ack 11 kotlin

Kotlin是否支持协方差设置中的上/下类型边界.我想说

class Foo<out T> {
  fun or<U of T or greater>(other: U): <U> = ...
}
Run Code Online (Sandbox Code Playgroud)

在Scala中会是这样的

class Foo[+T] {
  def or[U >: T](other: U): U = ...
}
Run Code Online (Sandbox Code Playgroud)

但编译器似乎不喜欢这样,它抱怨类型参数T的协方差.

And*_*lav 10

Kotlin此时不支持下限.有时您可以通过定义扩展函数而不是成员来逃避:

fun <T> Foo<T>.or(other: T): T = ...
Run Code Online (Sandbox Code Playgroud)

  • @Matthias"此外,是否有计划为Kotlin添加较低类型的界限来启用此类方法?" - 它在桌子上,是的 (5认同)
  • 如何,在我给出的示例的上下文中,这在Scala的SDK中是常见的? (2认同)
  • @AndreyBreslav在Scala中,`Option [+ A]`具有方法`getOrElse(other:=&gt; B):B`,其中`B&gt;:A`。考虑到“ B”可能是“ A”,但考虑到下限被删除时却不是这样,为什么这样安全?此外,是否有计划向Kotlin添加较低类型的边界以启用此类方法?目前,Kotlin中的任何类型构造函数都注定无法将其类型参数定义为协变和丧失方法(例如上述方法)或丧失协变,这会阻止人们编写具有“空”实例(如Tree,Option等)的ADT。使用`Nothing`实例化时,它们将不会编译) (2认同)