在Scala中的类型别名内建立类型成员的边界

时间:2016-07-21 20:40:29

标签: scala type-members

假设:

trait Record {
  type ID
  val id: ID
}

trait DataSource {
  type ID
  def read(id: ID): Try[R]
}

我希望能够一般性地描述read功能。

type Reader[R <: Record, DS <: DataSource] = (DS#ID) => Try[R]

我如何在此保证类型安全,以使DS#IDR#ID不同类型? 我试过......

type Reader[R <: Record, DS <: DataSource, R#ID <: DS#ID] = (DS#ID) => Try[R]

但这样做不会编译。这种情况的正确语法是什么?

1 个答案:

答案 0 :(得分:0)

在处理Reader的类型参数时,ID必须作为自己的参数拉出。

type Reader[R <: Record, DS <: DataSource, ID] = (ID) => Try[R]

一旦完成,就可以在其上放置额外的边界......

type Reader[R <: Record, DS <: DataSource, ID <: DS#ID =:= R#ID] = (ID) => Try[R]