scala - 为什么以及何时应该 trait 和 object 具有相同的名称?
问题描述
这是什么原因
trait Dog {
def bark = "woof"
}
object Dog extends Dog
有效,但以下无效
trait Dog {
def bark = "woof"
}
class Dog extends Dog
我在某处读到,在上面提到的第一种情况下,该对象不是伴随对象。对象和特征应该具有相同名称的情况是什么?
解决方案
从介绍到第 2 章(标识符、名称和范围):
有两种不同的名称空间,一种用于类型,一种用于术语。
第 5.5 节(对象定义)几乎完全包含您的示例(使用Point
而不是Dog
),并带有以下注释:
请注意,名称的双重使用
Point
是合法的,因为类定义在类型名称空间中定义名称 Point,而对象定义在术语命名空间中定义名称。
(强调我的)
你的第二个例子class Dog extends Dog
不起作用,因为class Dog
和都trait Dog
在类型的命名空间中,这会导致冲突。
每当您在 Java 等中使用静态方法时,都会使用Companion object
(除了伴随对象更好,因为它们是对象,并且可以作为普通值传递)。
这种情况object Foo extends Foo
显得有些做作,而且相当罕见。你有一个使用它的实际例子吗?如果不是,那么它只是一个正式有效的极端情况,仅仅是因为它没有被明确禁止。
编辑:object AnsiColor extends AnsiColor
似乎是该object X extends X
模式最“重要”的应用之一。
推荐阅读
- python - Python numpy.diff 没有给出负数计算加速度?
- r - R download.file 下载损坏且较小的文件
- networking - 是否可以通过任意数量的节点生成胖树?
- python - 如何修改变量中的路径(python)?
- azure-cognitive-search - 支持政府社区云 (gcc) 中的 Azure 搜索服务
- java - 如何解压缩大量 gif
- python - 对带有配置文件的 python 日志记录感到困惑(仅记录在配置文件中为 root_logger 设置的内容)
- python - 为什么启用 Eager Execution 时可训练变量会消失?
- node.js - fluent-ffmpeg 与作物的纵横比
- c# - 使用泛型类型的问题
我的 C# 课