Я не думаю, что это можно сделать с экзистенциальным типом. Работает с параметром типа:
class PagingListModel[T <: Product](... query: Query[Projection[T]]) {
...
def getPageData(): List[_ <: Product] = ...
queryToQueryInvoker(query.drop(itemStartNumber).take(pageSize)).list
}
Исходная версия была бы правильной, но Scala не может проверить ее из-за ограничения, подобного ограничению мономорфизма Хаскелла. Параметр типа для queryToQueryInvoker должен быть универсальным типом [T <: Product] forAll { type T }
, который не поддерживается Scala.
Используя явный параметр типа, можно создать экземпляр queryToQueryInvoker с этим конкретным типом. Метод по-прежнему может возвращать List[_ <: Product]
, поскольку List является ко-вариантом в своем типе элемента.
Редактировать: Это все-таки возможно. Вы должны переместить экзистенциальное в нужное место:
class PagingListModel(... query: Query[Projection[T]] forSome { type T <: Product }) {
def getPageData(): List[_ <: Product] = ... {
val i = queryToQueryInvoker(query.drop(itemStartNumber).take(pageSize))
i.list
}
}
Без дополнительной переменной i
компилятор выведет неверный тип, а затем пожалуется на него. Выглядит как ошибка для меня.