scala - 为什么 scala value class#toString 包含案例类信息?

标签 scala value-class

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

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

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

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

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

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

最佳答案

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

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

关于scala - 为什么 scala value class#toString 包含案例类信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40843547/

相关文章:

java - 如何确定 Scala 中调用的 JAR 的名称?

scala - 在值类上使用私有(private)构造函数是否会抵消值类的好处?

对于具有部分函数参数方法的基类型,Scala 值类编译失败

function - 带有隐式的 Scala 函数式文字

scala - 如果集合中存在列,则过滤 spark/scala 数据框

scala - spark csv读取速度很慢,虽然我增加了节点数

scala - 是否有像参数化类型一样的抽象类型的 list ?

Scala:识别值类的对象

scala - 使用 json4s 序列化可选值类实例时出现问题

scala - 为什么我不能重写 Scala 中采用值类作为参数的方法?