In seinem Vortrag Compilers are Databases präsentiert Martin Odersky eine interessante Abweichung Ecke Fall:@uncheckedVariance in Kotlin?
class Tree[-T] {
def tpe: T @uncheckedVariance
def withType(t: Type): Tree[Type]
}
T
definiert ist kontra zu sein, weil es nützlich ist, von einer typisierten Baum zu denken (Tree[Type]
) als Subtyp eines nicht typisierten Baum (Tree[Nothing]
), aber nicht umgekehrt.
Normalerweise würde der Scala-Compiler über T
beschweren, der als Rückgabetyp der tpe
-Methode erscheint. Deshalb schließt Martin den Compiler mit einer @uncheckedVariance
Annotion.
Hier ist das Beispiel Kotlin übersetzt:
abstract class Tree<in T> {
abstract fun tpe(): T
abstract fun withType(t: Type): Tree<Type>
}
Da der Kotlin Compiler über T
erwartet, beschwert sich in einem 'aus' Stelle erscheinen. Hat Kotlin etwas ähnliches wie @uncheckedVariance
? Oder gibt es einen besseren Weg, um dieses spezielle Problem zu lösen?
Sie wirklich wollen, verwenden 'Baum [Unit] nur' für untypisierten Bäume. Es verhindert mehr Bugs (Kompilierungszeit vs Laufzeitfehler) und erfordert nicht, dass Sie den Typ Checker umgehen (hey, das ist lustig, nicht wahr). Odersky war hier nur Oderskying. – rightfold