Scala类型别名包括伴侣对象[初学者]

时间:2010-10-13 03:26:00

标签: scala encapsulation type-alias companion-object

我想编写一个类型别名来缩短,修改和封装的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把我的类型理解为同样的东西,包括使用其创建者方法的伴随对象,为了缩短代码和黑盒子呢? 或者,为什么我不应该首先这样做?

2 个答案:

答案 0 :(得分:7)

答案其实很简单:

class ConcreteClass {
  type DataType = List[String]
}
object ConcreteClass {
  val DataType = List
}
val d = ConcreteClass.DataType.empty

这使我的代码能够调用ConcreteClass.DataType来构建包含List中所有方法的列表并且付出很少的努力。

非常感谢Oleg的见解。他的答案也是最好的,以防你不想委托任何对ConcreteClass.DataType的调用,而是精确控制你想让调用者做什么。

答案 1 :(得分:5)

这个怎么样?

class ConcreteClass {
  type DataType = List[String]
}
object DataType {
  def apply(): ConcreteClass#DataType = Nil
}
//...
val a = DataType()