Возьмем этот пример кода:
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.