Java 为什么“ScalaObject”存在?

Java 为什么“ScalaObject”存在?,java,inheritance,scala,programming-languages,language-design,Java,Inheritance,Scala,Programming Languages,Language Design,为什么所有Scala类都继承自ScalaObject,尽管与定义其他方法的AnyRef相比,该特性完全为空且没有(可见?)功能 这会不会减慢方法调用的速度,比如equals()或hashCode(),因为它需要考虑另一个类(这可能会覆盖这些方法) 难道不能将AnyRef和ScalaObject折叠成一个类吗 更新: ScalaObject和新的2.10版本的Scala。ScalaObject插入了一个$tag方法,根据中的注释,“需要该方法来优化与case类构造函数匹配的模式匹配表达式。”由于名

为什么所有Scala类都继承自
ScalaObject
,尽管与定义其他方法的
AnyRef
相比,该特性完全为空且没有(可见?)功能

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

难道不能将AnyRef和ScalaObject折叠成一个类吗

更新:
ScalaObject和新的2.10版本的Scala。

ScalaObject
插入了一个
$tag
方法,根据中的注释,“需要该方法来优化与case类构造函数匹配的模式匹配表达式。”由于名称以
$
开头,它当然应该被认为是“隐藏的”给应用程序程序员。在Scala 2.8中,它是完全空的,所以我想它是为了向后兼容而存在的。

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

方法调度不会链接类继承结构以查找实现。编译器为反映其网络覆盖/继承方法沿袭的每个类构造一个网络方法调度表。这是静态解析所有类型的优点之一。

为什么不将$tag方法插入AnyRef?我想是向后兼容。(下载并阅读了2.8源代码后扩展了我的答案。)我浏览了编译器代码,有一些代码以特殊方式处理(file
Global.scala
),但没有解释为什么会有。考虑到2.7没有向后兼容性,为什么不在2.8.0中删除它?据我所知,模式匹配器不再使用
$tag
优化,它只是尚未从为类/特征生成的字节码中删除。