@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>
}
Другие вопросы по тегам