@uncheckedVariance 在 Kotlin 中?

@uncheckedVariance in Kotlin?

在他的演讲 Compilers are Databases 中,Martin Odersky 提出了一个有趣的方差极端情况:

class Tree[-T] {
  def tpe: T @uncheckedVariance
  def withType(t: Type): Tree[Type]
}

T 被定义为逆变的,因为将类型树 (Tree[Type]) 视为非类型树 (Tree[Nothing]) 的子类型很有用,但不是反过来。

通常,Scala 编译器会抱怨 T 显示为 tpe 方法的 return 类型。这就是 Martin 使用 @uncheckedVariance 注释关闭编译器的原因。

下面是翻译成 Kotlin 的例子:

abstract class Tree<in T> {
    abstract fun tpe(): T
    abstract fun withType(t: Type): Tree<Type>
}

正如预期的那样,Kotlin 编译器抱怨 T 出现在 'out' 位置。 Kotlin 有类似 @uncheckedVariance 的东西吗? 或者有更好的方法来解决这个特定问题吗?

Kotlin 有一个 @UnsafeVariance 注解,相当于 scala 中的 @uncheckedVariance

abstract class Tree<in T> {
  abstract fun tpe(): @UnsafeVariance T
  abstract fun withType(t: Type): Tree<Type>
}