在他的演讲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
方法的返回类型。这就是 Martin 用注解关闭编译器的@uncheckedVariance
原因。
这是翻译成 Kotlin 的示例:
abstract class Tree<in T> {
abstract fun tpe(): T
abstract fun withType(t: Type): Tree<Type>
}
正如预期的那样,Kotlin 编译器抱怨T
出现在“出局”位置。Kotlin 有类似的东西@uncheckedVariance
吗?还是有更好的方法来解决这个特定问题?