加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使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 = ???
  }
}

这失败并出现错误:

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变得不稳定时,这就成功了.目前,我通过使它成为抽象类型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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读