如何使scala类型有意挥发
发布时间:2020-12-16 18:27:41 所属栏目:安全 来源:网络整理
导读:根据 http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-types,类型在符合特定条件时是易变的.是否有可能使类型不易变形(例如通过注释)?有什么可能的选择吗? 我的用例如下:我想编写一个库,用A:B公开类型A和B,B是易失性的.然后
根据
http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-types,类型在符合特定条件时是易变的.是否有可能使类型不易变形(例如通过注释)?有什么可能的选择吗?
我的用例如下:我想编写一个库,用A<:B公开类型A和B,B是易失性的.然后作为这个库的用户,我希望能够用类型B之一覆盖类型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 = ??? } } 这失败并出现错误:
但是当我让A变得不稳定时,这就成功了.目前,我通过使它成为抽象类型Abstract的子类来实现A volatile,它在实现中只是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 = ??? } } 这编译并且工作正常,但抽象有点人为,我想知道是否还有其他方法. 解决方法
您正在寻找
@volatile annotation,这将让编译器知道var应该是volatile.它的行为应该与等效的Java注释相同.
我们可以通过在文件SoVolatile.scala中构建一个简单的类来证明这一点: class SoVolatile { @volatile var boom = 5 } 然后在命令行上,转到该类的目录并运行: $scalac SoVolatile.scala $javap -verbose -private SoVolatile 在里面,我们发现线私有volatile int boom;如果在命令行上运行它,则更容易找到: $javap -verbose -private SoVolatile | grep "private volatile" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |