@uncheckedVariance 在 Kotlin 中?
@uncheckedVariance in Kotlin?
在他的演讲 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
方法的 return 类型。这就是 Martin 使用 @uncheckedVariance
注释关闭编译器的原因。
下面是翻译成 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>
}
在他的演讲 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
方法的 return 类型。这就是 Martin 使用 @uncheckedVariance
注释关闭编译器的原因。
下面是翻译成 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>
}