10

为什么所有Scala类都从ScalaObject继承,尽管该特征完全为空,并且与AnyRef相比没有(可见?)功能,但它确实定义了其他方法?为什么`ScalaObject`存在?

不会减慢方法调用,如equals()hashCode(),因为它需要考虑另一个类(可能会覆盖方法)?

是不是可以折叠AnyRef和ScalaObject到一个类中?

更新: ScalaObject was eradicated与新的2.10版本的斯卡拉。

回答

11

ScalaObject插入$tag方法,根据library source code for 2.7中的注释,“需要优化与案例类的构造函数相匹配的模式匹配表达式”。由于该名称以$开头,因此它当然应该被认为是应用程序员“隐藏”的。在Scala 2.8中,它完全是空的,所以我猜这是为了向后兼容。

+0

为什么没有将$ tag方法插入到AnyRef中? – soc 2010-09-25 20:23:21

+0

向后compat,我猜。 (扩展我的答案后下载和阅读2.8源代码。) – 2010-09-25 20:33:22

+0

我已经通过编译器代码grepped,并有一些代码来处理它在一个特殊的方式(文件'Global.scala'),但没有解释为什么它在那里。 – 2010-09-25 20:40:41

4

它也为静态分析提供了便利。例如,假设你有一个可以搜索代码库的工具(编译或不编译),并告诉你可以通过从这些代码中提取一个特征来改进一些凝聚力/耦合/层平衡/你有什么的度量类并为这些类创建隐式转换。这个工具只会报告可以从继承ScalaObject的类中提取的特征,同时报告任何Java类中的有利可图的隐式转换。同样的工具会报告来自ScalaObject子类的任何可能的“空”返回值(其中Option或类似的通常是更好的选择),同时忽略来自Java类的空返回值。

7

方法调度不会链接寻找实现的类继承结构。编译器为每个类构造一个净方法调度表,以反映它的净重写/继承方法沿袭。这是静态解决所有输入的优点之一。