为什么阶值类#的toString包含情况类信息?(why scala value class#toS

2019-09-29 03:40发布

值类可以用来实现类型安全没有拆箱的开销。

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

但是,如果你拨打.toString上的值类的实例方法,它会打印出类似这样:

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

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

所以我想编译器包括毕竟一些信息?

Answer 1:

并不是的。 编译器创建一个静态方法(在斯卡拉此相对应的类的对象伴侣),这是为了模拟调用你的价值类类型的对象上的方法调用你的int值作为参数。

你的价值类本身只存在于源代码。 在编译的字节实际的原始INT使用和静态方法被调用,而不是真正的方法调用新的对象实例。 你可以阅读更多关于这种机制在这里 。



Answer 2:

值类被设计成使得添加或移除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详细解释了如何精确值类实现,是他们生存何种情况下,看到有用的,虽然有些细节可能会从此改变。



文章来源: why scala value class#toString contains case class info?