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> }