加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:14:33 所属栏目:安全 来源:网络整理
导读:我想编写一个类型别名来缩短,修改和封装的 Scala代码. 假设我有一些集合,它具有作为地图列表的属性,其值是元组. 我的类型会编写类似List [Map [Int,(String,String)]]的东西,或者我的应用程序允许的更通用的东西.我可以想象有一个超类型要求Seq [MapLike [In
我想编写一个类型别名来缩短,修改和封装的 Scala代码.
假设我有一些集合,它具有作为地图列表的属性,其值是元组.
我的类型会编写类似List [Map [Int,(String,String)]]的东西,或者我的应用程序允许的更通用的东西.我可以想象有一个超类型要求Seq [MapLike [Int,Any]]或任何漂浮我的船,具体的子类更具体.

然后我想为这个长类型写一个别名.

class ConcreteClass {
  type DataType = List[Map[Int,String)]]
  ...
}

然后我会愉快地使用ConcreteClass#DataType,我可以拿一个,然后使用它.

现在假设我添加了一个函数

def foo(a : DataType) { ... }

我想从外面用空列表调用它.
我可以调用foo(List()),但是当我想将我的底层类型更改为另一种类型的Seq时,我将不得不返回并更改此代码.此外,这个空列表不是非常明确的是作为DataType.并且伴随对象没有关联的List方法,因此我无法调用DataType()或DataType.empty.当我需要非空列表时,它会更加烦人,因为我必须写出这个长类型的重要部分.

有什么办法我可以让Scala把我的类型理解为同样的东西,包括带有创建者方法的伴随对象,为了缩短代码和黑盒子呢?
或者,为什么我不应该首先这样做?

解决方法

答案其实很简单:

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

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

非常感谢Oleg的见解.如果你不想委托给任何对ConcreteClass.DataType的调用,他的答案也是最好的,但是准确控制你想让调用者做什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读