Kotlin中的uncheckedVariance?

Martin Odersky在“ 编译器是数据库”的演讲中提出了一个有趣的方差角落案例:

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

T被定义为是逆变的,因为将类型树( Tree[Type] )看作是一个无类型树( Tree[Nothing] )的子Tree[Type]是有用的,而不是相反。

通常,Scala编译器会抱怨T出现在tpe方法的返回类型中。 这就是为什么Martin用@uncheckedVariance annotion关闭编译器的原因。

这里是翻译成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> }