首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么scala值class#toString包含案例类信息?

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

Stack Overflow用户
提问于 2016-11-28 11:46:59
回答 2查看 517关注 0票数 2

价值类可以用于实现类型安全,而不需要取消装箱的开销。

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

但是,如果您确实调用了值类实例上的.toString方法,它将打印如下所示:

代码语言:javascript
运行
复制
scala> val myValueClass = X(3)
myValueClass: X = 3

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

所以我想编译器到底包括了一些信息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-28 12:27:23

不怎么有意思。编译器创建一个静态方法(在Scala中,这对应于类的伴生对象),该方法以int值作为参数调用,以便模拟对值类类型的对象调用方法。

您的值类本身仅存在于源代码中。在编译后的字节码中,使用了实际的基本int,并且调用静态方法,而不是使用实方法调用新的对象实例。您可以阅读更多关于此机制的这里

票数 5
EN

Stack Overflow用户

发布于 2016-11-28 18:44:05

值类的设计使得添加或删除extends AnyVal (如果合法的话)不应更改计算结果(除非非case值类具有像case类一样自动定义的equalshashCode )。这就要求他们在某些情况下能够生存。

代码语言:javascript
运行
复制
def toString(x: Any) = x.toString

toString(myValueClass)

但你问题中的情况不是其中之一。

http://docs.scala-lang.org/sips/completed/value-classes.html#expansion-of-value-classes更精确地解释了值类是如何实现的,并且对于了解它们在哪些情况下生存是有用的,尽管此后一些细节可能发生了变化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40843547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档