@uncheckedVariance в Котлине?
Мартин Одерский в своем выступлении " Компиляторы баз данных" представляет интересный случай из дисперсионного угла:
class Tree[-T] {
def tpe: T @uncheckedVariance
def withType(t: Type): Tree[Type]
}
T
определяется как контравариантный, потому что полезно думать о типизированном дереве (Tree[Type]
) как подтип нетипизированного дерева (Tree[Nothing]
), но не наоборот.
Обычно компилятор Scala будет жаловаться на T
появляется в качестве типа возврата tpe
метод. Вот почему Мартин закрывает компилятор @uncheckedVariance
annotion.
Вот пример, переведенный на Kotlin:
abstract class Tree<in T> {
abstract fun tpe(): T
abstract fun withType(t: Type): Tree<Type>
}
Как и ожидалось, компилятор Kotlin жалуется на T
появляясь в "вне" позиции. Есть ли у Котлина что-то похожее на @uncheckedVariance
? Или есть лучший способ решить эту проблему?
1 ответ
Котлин имеет @UnsafeVariance
аннотация, которая является эквивалентом @uncheckedVariance
в скале:
abstract class Tree<in T> {
abstract fun tpe(): @UnsafeVariance T
abstract fun withType(t: Type): Tree<Type>
}