Scala @科特林没有被选中?

Scala @科特林没有被选中?,scala,generics,kotlin,contravariance,subtyping,Scala,Generics,Kotlin,Contravariance,Subtyping,在他的演讲中,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注

在他的演讲中,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>
}
抽象类树{
抽象乐趣tpe():T
抽象类型(t: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>
}
抽象类树{
抽象乐趣tpe():@UnsafeVariance T
抽象类型(t:Type):树
}

对于非类型化的树,您确实希望只使用
Tree[Unit]
。它可以防止更多的bug(编译时与运行时错误),并且不需要您处理类型检查器(嘿,这很有趣,不是吗)。奥德斯基只是在这里玩奥德斯基。有趣的是,
@unsafeVariance
似乎是。谢谢