2016-06-23 13 views
5

Ich weiß, dass flüchtige Typen in Scala gibt esScala volatile Typen: Wie ist @uncheckedStable unsicher?

die Möglichkeit, dass ein Typ-Parameter oder abstrakten Typ Instanz eines Typs keine Nicht-Null-Wert

(http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-types)

hat zu modellieren

Aber was ist das Problem genau? Gibt es ein Beispiel, das @uncheckedStable verwendet (siehe http://www.scala-lang.org/files/archive/spec/2.11/11-annotations.html#scala-compiler-annotations), die unsicheren Code produziert?

Antwort

1
object Main extends App {  
    trait A { type T = Int } 
    trait B { type T <: String } 
    def f(b: B)(t: b.T) = t.length 

    @annotation.unchecked.uncheckedStable val x: A with B = null 
    val y: x.T = 0 // legal because x is A 

    f(x)(y) 
} 

Now running... 
[info] Running Main 
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 

(. Basierend auf retronym Antwort auf Cannot override a type with non-volatile upper bound)

+0

hm, aber dies scheint zu "Arbeit" auch ohne @ annotation.unchecked.uncheckedStable und wenn ich die Spezifikation richtig (http lesen: // www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-types), A mit B ist nicht einmal flüchtig –

+0

Ja, Sie haben Recht. Und wenn ich versuche, seine erste Antwort zu ändern, scheint 'uncheckedStable' überhaupt nicht zu funktionieren: http://scastie.org/20577 –

+0

Ich entferne den Scheck dann, da dies den Grund für den Typ nicht beantwortet Volatilität, macht es nur verwirrender –