为什么有些集合类除了类方法之外还有一个“空”实例方法?

时间:2011-02-09 10:41:00

标签: scala collections methods language-design

两者都存在于此处:

Map.empty[Int, Int]
Map(1 -> 41).empty

Set().empty
Set.empty

但这里只存在类方法:

List.empty        //OK
List(1,2,3).empty //Doesn't exist

Array.empty       //OK
Array("a").empty  //Doesn't exist

对于类方法,empty不是一个完美的例子(因此不应该弃用实例方法empty)吗?

或者是否应该将empty实例方法添加到缺少它的类中?

从语言的角度来看,是否有任何东西只能让empty作为一种类方法(例如类型推断,更高级的类型......)。

PS: 有人建议,如果没有实例方法empty

,那么使用默认值的地图将更难实现
Map[Int, Int](1->2, 21->42).withDefault(_*2).empty

您怎么看?

3 个答案:

答案 0 :(得分:2)

这是真的,empty可以是类实例上的方法。集合和映射所需的原因是它们使用此方法实现其构建器。我想其他地方没有包含的原因是因为它不是典型的用例。

答案 1 :(得分:1)

我想知道为什么Mapempty,而不是相反。毕竟,这不是你对某事做的操作,它只是某事的一个例子。

反正:

(List(1, 2, 3): Traversable[Int]).companion.empty

我将Traversable放在那里只是为了展示这适用于任何集合。

答案 2 :(得分:0)

只有不可变的List。只有一个EmptyList实例,因此类级别为空是没有意义的。

Map trait可以通过mutable实现,因此您需要多个实例。

......我认为这个解释有些缺失,但也许这是一个开始。