12

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

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

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

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

这是翻译成 Kotlin 的示例:

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

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

4

1 回答 1

10

Kotlin 有一个与scala@UnsafeVariance等价的注解:@uncheckedVariance

abstract class Tree<in T> {
  abstract fun tpe(): @UnsafeVariance T
  abstract fun withType(t: Type): Tree<Type>
}
于 2016-04-11T21:20:51.630 回答