为什么 Scala 值 class#toString 包含案例类信息?

ped*_*o91 2 scala value-class

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

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

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

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

scala> myValueClass.toString
res5: String = X(3)
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ski 5

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

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