Два связанных параметра экзистенциального типа - PullRequest
0 голосов
/ 30 апреля 2018

Давайте возьмем этот пример кода:

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.

1 Ответ

0 голосов
/ 30 апреля 2018

Это должно скомпилировать (заменил , на ;):

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