2

值类可用于实现类型安全,而无需拆箱的开销。

我的印象是,在运行时这样的类型/类将“不存在”,被视为简单类型(例如,值类在运行时case class X(i: Int) extends AnyVal将是简单的)。Int

.toString但是,如果您确实在值类实例上调用方法,它会打印如下内容:

scala> val myValueClass = X(3)
myValueClass: X = 3

scala> myValueClass.toString
res5: String = X(3)

所以我猜编译器毕竟包含一些信息?

4

2 回答 2

5

并不真地。编译器创建一个静态方法(在 Scala 中,这对应于类的伴生对象),以您的 int 值作为参数调用该方法,以模拟在您的值类类型对象上调用方法。

您的值类本身只存在于源代码中。在已编译的字节码中,使用了实际的原始 int 并调用静态方法,而不是使用实际方法调用的新对象实例。您可以在此处阅读有关此机制的更多信息。

于 2016-11-28T12:27:23.950 回答
1

值类的设计使得添加或删除extends AnyVal(如果合法)不应该改变计算结果(即使是非案例值类也有equalshashCode像案例类一样自动定义)。这要求它们在某些情况下能够生存,例如

def toString(x: Any) = x.toString

toString(myValueClass)

但是您问题中的情况不是其中之一。

http://docs.scala-lang.org/sips/completed/value-classes.html#expansion-of-value-classes更准确地解释了值类是如何实现的,并且有助于查看它们在什么情况下仍然存在,尽管有些自那以后,细节可能已经改变。

于 2016-11-28T18:44:05.923 回答