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