2016-04-11 13 views
9

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?

+0

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

Antwort

9

Kotlin hat eine @UnsafeVariance Anmerkung, die ein Äquivalent zu @uncheckedVariance in scala ist:

abstract class Tree<in T> { 
    abstract fun tpe(): @UnsafeVariance T 
    abstract fun withType(t: Type): Tree<Type> 
} 
+0

Interessant, '@ unsafeVariance' scheint [ein relativ neues Feature] zu sein (https://blog.jetbrains.com/kotlin/2015/10/kotlin-1-0-beta-candidate-is-out/). Vielen Dank! – fredoverflow