值类可以用来实现类型安全没有拆箱的开销。
我的印象是在运行时这样的类型/类别将“不存在”,被视为简单的类型(例如,值类case class X(i: Int) extends AnyVal
将是一个简单的Int
上运行时)。
但是,如果你拨打.toString
上的值类的实例方法,它会打印出类似这样:
scala> val myValueClass = X(3)
myValueClass: X = 3
scala> myValueClass.toString
res5: String = X(3)
所以我想编译器包括毕竟一些信息?
并不是的。 编译器创建一个静态方法(在斯卡拉此相对应的类的对象伴侣),这是为了模拟调用你的价值类类型的对象上的方法调用你的int值作为参数。
你的价值类本身只存在于源代码。 在编译的字节实际的原始INT使用和静态方法被调用,而不是真正的方法调用新的对象实例。 你可以阅读更多关于这种机制在这里 。
值类被设计成使得添加或移除extends AnyVal
(如果法律)不应该改变计算的结果(除了甚至非情况值类具有equals
和hashCode
等情况下类自动定义)。 这就要求在他们生存某些情况下,如
def toString(x: Any) = x.toString
toString(myValueClass)
但在你的问题的情况是不是其中之一。
http://docs.scala-lang.org/sips/completed/value-classes.html#expansion-of-value-classes详细解释了如何精确值类实现,是他们生存何种情况下,看到有用的,虽然有些细节可能会从此改变。