Scala @科特林没有被选中?
在他的演讲中,Martin Odersky提出了一个有趣的案例: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注
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
似乎是。谢谢