两个相关的存在类型参数
Two related existential type parameters
让我们来看这个示例代码:
trait DataProcessor[D] {
def computeData(): D
}
case class DataItem[D, P <: DataProcessor[D]](processor: P, data: D)
def computeDataFromItems(items: Set[DataItem[_, _]]) = items collectFirst {
case DataItem(s: DataProcessor[_], d) =>
s.computeData()
}
使用 Scala 2.11 编译时,会产生以下错误:
Error:(8, 77) type arguments [_,_] do not conform to class DataItem's type
parameter bounds [D,P <: TwoExistentials.DataProcessor[D]]
def computeDataFromItems(items: Set[DataItem[_, _]]) = items collectFirst {
似乎 collectFirst
方法需要更多类型信息,这些信息不包含在 DataItem
class 的一对存在类型中。
是否有机会为方法的参数提供更具体的类型,例如:
def computeDataFromItems(items: Set[DataItem[D, P] forSome { type D, type P <: DataProcessor[D] }])
不幸的是哪个不能编译?
否则,有没有办法允许以类型安全的方式在集合中使用具有两个相关类型参数的 class?
顺便说一下,我已经考虑过使用无形类型,而不是存在类型。但我正在寻找 classical Scala 集合的实现。
这应该编译(将 ,
替换为 ;
):
def computeDataFromItems(items: Set[DataItem[D, P] forSome { type D; type P <: DataProcessor[D] }])
让我们来看这个示例代码:
trait DataProcessor[D] {
def computeData(): D
}
case class DataItem[D, P <: DataProcessor[D]](processor: P, data: D)
def computeDataFromItems(items: Set[DataItem[_, _]]) = items collectFirst {
case DataItem(s: DataProcessor[_], d) =>
s.computeData()
}
使用 Scala 2.11 编译时,会产生以下错误:
Error:(8, 77) type arguments [_,_] do not conform to class DataItem's type
parameter bounds [D,P <: TwoExistentials.DataProcessor[D]]
def computeDataFromItems(items: Set[DataItem[_, _]]) = items collectFirst {
似乎 collectFirst
方法需要更多类型信息,这些信息不包含在 DataItem
class 的一对存在类型中。
是否有机会为方法的参数提供更具体的类型,例如:
def computeDataFromItems(items: Set[DataItem[D, P] forSome { type D, type P <: DataProcessor[D] }])
不幸的是哪个不能编译?
否则,有没有办法允许以类型安全的方式在集合中使用具有两个相关类型参数的 class?
顺便说一下,我已经考虑过使用无形类型,而不是存在类型。但我正在寻找 classical Scala 集合的实现。
这应该编译(将 ,
替换为 ;
):
def computeDataFromItems(items: Set[DataItem[D, P] forSome { type D; type P <: DataProcessor[D] }])