2016-06-23 23 views
5

Scala uçucu tip bir tür parametresi veya bir tür soyut türü örnek bir boş olmayan bir değerScala uçucu türleri: @uncheckedStable güvenli olmayan nedir?

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

yok olasılığı

model olduğunu biliyoruz

Fakat bunun tam olarak sorunu nedir? Güvenli olmayan kod üreten @uncheckedStable (bkz. http://www.scala-lang.org/files/archive/spec/2.11/11-annotations.html#scala-compiler-annotations) kullanan bir örnek var mı?

cevap

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 

(. Cannot override a type with non-volatile upper bound için retronym cevabı dayanarak)

+0

hm, ancak bu kadar "iş" bile @ annotation.unchecked.uncheckedStable olmadan ve eğer doğru spec okuyorum if (http görünüyor: // www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-types), A ile B bile uçucu değildir –

+0

Evet, haklısınız. Ve onun yerine ilk cevabını değiştirmeye çalışırsam, 'uncheckedStable' hiç çalışmıyor gibi görünmektedir: http://scastie.org/20577 –

+0

Çeki kaldırıyorum, çünkü bu türün sebebini yanıtlamıyor çünkü volatilite, sadece daha kafa karıştırıcı yapar –