首页 > 解决方案 > 两个相关的存在类型参数

问题描述

让我们看这个示例代码:

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 [_$1,_$2] do not conform to class DataItem's type 
parameter bounds [D,P <: TwoExistentials.DataProcessor[D]]
  def computeDataFromItems(items: Set[DataItem[_, _]]) = items collectFirst {

似乎该collectFirst方法需要更多类型信息,这些信息不包含在类的存在类型对中DataItem

是否有机会为方法的参数提供更具体的类型,例如:

def computeDataFromItems(items: Set[DataItem[D, P] forSome { type D, type P <: DataProcessor[D] }])

不幸的是,哪个没有编译?

否则,有没有办法允许以类型安全的方式在集合中使用具有两个相关类型参数的类?

顺便说一句,我已经考虑过使用无形的,而不是存在的类型。但我正在寻找经典 Scala 集合的实现。

标签: scalaexistential-typescala-2.11

解决方案


这应该编译(替换,;):

def computeDataFromItems(items: Set[DataItem[D, P] forSome { type D; type P <: DataProcessor[D] }])

推荐阅读