为什么所有Scala类都继承自ScalaObject
,尽管该特征完全为空且与AnyRef
相比没有(可见?)功能,而equals()
确定了其他方法?
这会不会减慢hashCode()
或{{1}}这样的方法调用,因为它需要考虑另一个类(可能会覆盖这些方法)?
是否有可能将AnyRef和ScalaObject折叠成一个类?
更新 ScalaObject was eradicated带有新版本的Scala 2.10。
答案 0 :(得分:11)
ScalaObject
会插入一个$tag
方法,根据library source code for 2.7中的注释,“需要优化与案例类构造函数匹配的模式匹配表达式。”由于名称以$
开头,因此它当然应被视为应用程序员“隐藏”。在Scala 2.8中,它完全是空的,所以我猜它是为了向后兼容。
答案 1 :(得分:7)
方法调度不会将类继承结构链接起来寻找实现。编译器为每个类构造一个net方法调度表,以反映其net覆盖/继承方法沿袭。这是静态解决所有打字的优点之一。
答案 2 :(得分:4)
它还为静态分析提供了方便的钩子。例如,假设您有一个可以搜索代码库(已编译或未编译)的工具,并告诉您可以通过从这些提取特征来改进某些内聚性/耦合/层平衡/有什么用量的度量类并为这些类创建隐式转换。这个工具明智地仅报告可以从继承ScalaObject的类中提取的特性,同时报告来自任何Java类的可盈利的隐式转换。相同的工具将报告来自ScalaObject子类的任何可能的“null”返回(其中Option或类似通常是更好的选择),而忽略来自Java类的null返回。