假设:
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#ID
与R#ID
不同类型?
我试过......
type Reader[R <: Record, DS <: DataSource, R#ID <: DS#ID] = (DS#ID) => Try[R]
但这样做不会编译。这种情况的正确语法是什么?
答案 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]