价值类可以用于实现类型安全,而不需要取消装箱的开销。
我的印象是,在运行时,这类类型/类将“不存在”,被视为简单类型(例如,值类case class X(i: Int) extends AnyVal将是运行时的简单Int )。
但是,如果您确实调用了值类实例上的.toString方法,它将打印如下所示:
scala> val myValueClass = X(3)
myValueClass: X = 3
scala> myValueClass.toString
res5: String = X(3)所以我想编译器到底包括了一些信息?
发布于 2016-11-28 12:27:23
不怎么有意思。编译器创建一个静态方法(在Scala中,这对应于类的伴生对象),该方法以int值作为参数调用,以便模拟对值类类型的对象调用方法。
您的值类本身仅存在于源代码中。在编译后的字节码中,使用了实际的基本int,并且调用静态方法,而不是使用实方法调用新的对象实例。您可以阅读更多关于此机制的这里。
https://stackoverflow.com/questions/40843547
复制相似问题