【发布时间】:2011-04-24 15:35:30
【问题描述】:
我想写一个类型别名来缩短、漂亮和封装的 Scala 代码。
假设我有一些集合,它具有映射列表的属性,其值是元组。
我的类型会写类似List[Map[Int, (String, String)]] 的东西,或者我的应用程序允许的任何更通用的东西。我可以想象有一个超类型要求Seq[MapLike[Int, Any]] 或任何漂浮我的船,具体的子类更具体。
然后我想为这个长类型写一个别名。
class ConcreteClass {
type DataType = List[Map[Int, (String, String)]]
...
}
然后,我会很乐意在任何我可以使用的地方使用ConcreteClass#DataType,并使用它。
现在假设我添加一个函数
def foo(a : DataType) { ... }
我想用一个空列表从外部调用它。
我可以调用foo(List()),但是当我想将我的基础类型更改为另一种类型的Seq 时,我也必须回来更改此代码。此外,这个空列表的目的不是很明确DataType。而且伴生对象没有关联的List方法,所以不能调用DataType(),或者DataType.empty。当我需要非空列表时会更烦人,因为我必须写出这种长类型的重要部分。
有什么方法可以让 Scala 将我的类型理解为相同的东西,包括伴随对象及其创建者方法,以缩短代码并将其黑盒化? 或者,我为什么不应该首先这样做?
【问题讨论】:
标签: scala encapsulation type-alias companion-object