2016-05-27 5 views
4

http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-typesによれば、型は特定の条件に従うと揮発性です。その形式ではないタイプを(例えば注釈によって)揮発性にすることは可能ですか?どのような選択肢がありますか? ABを公開しているA <: BBのライブラリを作成したいと思います。そして、このライブラリの利用者として、私はタイプBの1とタイプAの値を上書きすることができるようにしたい:スカラー型を揮発性にする方法

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 volatile、これは成功します。現在、私はそれだけの実装でAnyこととそうでない場合は使用しません。抽象型AbstractのサブクラスにすることによりAが揮発ます

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アノテーションと同じように動作するはずです。そのクラスでディレクトリに移動して実行し、

class SoVolatile { 
    @volatile var boom = 5 
} 

を次にコマンドラインで:

私たちは、ファイルSoVolatile.scalaに単純なクラスを構築することにより、これを証明することができます

その内部
$ scalac SoVolatile.scala 
$ javap -verbose -private SoVolatile 

私たちはラインprivate volatile int boom;を見つける。

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

いいえ、これは揮発性のアノテーションとは関係ありませんが、スカラーのvolatile型に関するものです(名前以外は共通していません)。 ) –

関連する問題