2016-06-23 49 views
5

So che tipi volatili Scala ci sono per modellareTipi volatili Scala: come è @uncheckedStable non sicuro?

la possibilità che un parametro di tipo o un'istanza tipo astratto di un tipo non ha una valore non nullo

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

Ma qual è il problema con questo esattamente? C'è un esempio che utilizza @uncheckedStable (vedi http://www.scala-lang.org/files/archive/spec/2.11/11-annotations.html#scala-compiler-annotations) che produce codice non sicuro?

risposta

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 

(. Sulla base di risposta di retronym a Cannot override a type with non-volatile upper bound)

+0

hm, ma questo sembra "lavoro" anche senza @ annotation.unchecked.uncheckedStable e se sto leggendo le specifiche in modo corretto (http: // www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-types), A con B non è nemmeno volatile –

+0

Sì, hai ragione. E se provo a modificare la sua prima risposta, invece, 'unscheckedStable' non sembra funzionare affatto: http://scastie.org/20577 –

+0

Sto rimuovendo il controllo, poiché questo non sta rispondendo al motivo del tipo volatilità, rende solo più confuso –