我想写一个类型别名来缩短、漂亮和封装的 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 将我的类型理解为相同的东西,包括伴随对象及其创建者方法,以缩短代码并将其黑盒化?或者,我为什么不应该首先这样做?