http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-typesによれば、型は特定の条件に従うと揮発性です。その形式ではないタイプを(例えば注釈によって)揮発性にすることは可能ですか?どのような選択肢がありますか? A
とB
を公開しているA <: B
とB
のライブラリを作成したいと思います。そして、このライブラリの利用者として、私はタイプ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
は少し人工的で、私は別の方法があるのだろうかと思います。
いいえ、これは揮発性のアノテーションとは関係ありませんが、スカラーのvolatile型に関するものです(名前以外は共通していません)。 ) –