講演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
。そのため、Martin は注釈を付けてコンパイラをシャットダウンし@uncheckedVariance
ます。
Kotlin に翻訳された例を次に示します。
abstract class Tree<in T> {
abstract fun tpe(): T
abstract fun withType(t: Type): Tree<Type>
}
予想どおり、Kotlin コンパイラT
は「アウト」の位置に表示されると文句を言います。Kotlin には に似たものがあり@uncheckedVariance
ますか? または、この特定の問題を解決するためのより良い方法はありますか?