2016-05-27 82 views
4

根據http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-types,類型在遵守特定條件時是不穩定的。是否有可能產生一種不是那種形式的易失性類型(例如通過註釋)?那裏有什麼可能的選擇?如何使scala類型易於使用

我的用例如下:我想寫一個庫,其中公開類型ABA <: BB是易失性的。然後,因爲這個庫的用戶,我希望能夠覆蓋A類型的值與B類型之一:

trait TraitB { 
    def doSomething: Unit 
} 

trait Library { 
    type A 
    type B <: A with TraitB 
} 

object LibraryUser { 
    val library: Library = ??? 

    trait T { 
    val x: library.A 
    } 

    object U extends T { 
    val x: library.B = ??? 
    } 
} 

這失敗,出現錯誤:

error: overriding value x in trait T of type LibraryUser.library.A; value x has a volatile type; cannot override a member with non-volatile type

但是,當我做A易失性,此成功。目前,我做A揮發性使它成爲一個抽象類型Abstract的子類,也只是在執行Any否則不使用:

trait TraitB { 
    def doSomething: Unit 
} 

trait Library2 { 
    protected type Abstract 
    type A <: Any with Abstract 
    type B <: A with TraitB 
} 

trait Library2ImplementationHelper { 
    this: Library2 => 
    override type Abstract = Any 
} 

object Library2User { 
    val library: Library2 = ??? 

    trait T { 
    val x: library.A 
    } 

    object U extends T { 
    val x: library.B = ??? 
    } 
} 

這編譯和工作正常,但Abstract是一點點人爲的,我想知道是否有其他方法。

回答

-1

您正在尋找的@volatile annotation,這將讓編譯器知道var應該是易失性的。它的行爲應該與等效的Java註釋相同。

我們可以通過在一個文件中SoVolatile.scala構建一個簡單的類證明了這一點:

class SoVolatile { 
    @volatile var boom = 5 
} 

然後在命令行上,轉到目錄與類和運行:

$ scalac SoVolatile.scala 
$ javap -verbose -private SoVolatile 

內部的我們找到該行private volatile int boom;。這是一個比較容易找到,如果你在命令行中運行以下命令:

$ javap -verbose -private SoVolatile | grep "private volatile" 
+0

沒有,這有什麼好做的揮發性註釋,但大約是揮發性類型的斯卡拉(他們沒有任何共同之處,除了他們的名字) –