gpt4 book ai didi

scala - 如何故意使 Scala 类型变得易变

转载 作者:行者123 更新时间:2023-12-03 18:05:25 27 4
gpt4 key购买 nike

根据 http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#volatile-types , 类型在遵守特定条件时是易变的。是否可以使不是那种形式的类型变得易变(例如通过注释)?有哪些可能的替代方案?

我的用例如下:我想写一个库,它公开类型 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 volatile,这成功了。目前,我制作 A通过使其成为抽象类型的子类来 volatile 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有点人为,我想知道是否还有其他方法。

最佳答案

您正在寻找 @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"

关于scala - 如何故意使 Scala 类型变得易变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37493183/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com