Я пытаюсь реорганизовать функцию (найденную ближе к концу этого ответа StackOverflow), чтобы сделать ее немного более общей. Вот исходное определение функции:
def tryProcessSource(
file: File,
parseLine: (Int, String) => Option[List[String]] =
(index, unparsedLine) => Some(List(unparsedLine)),
filterLine: (Int, List[String]) => Option[Boolean] =
(index, parsedValues) => Some(true),
retainValues: (Int, List[String]) => Option[List[String]] =
(index, parsedValues) => Some(parsedValues)
): Try[List[List[String]]] = {
???
}
И вот что я пытаюсь изменить:
def tryProcessSource[A <: Any](
file: File,
parseLine: (Int, String) => Option[List[String]] =
(index, unparsedLine) => Some(List(unparsedLine)),
filterLine: (Int, List[String]) => Option[Boolean] =
(index, parsedValues) => Some(true),
transformLine: (Int, List[String]) => Option[A] =
(index, parsedValues) => Some(parsedValues)
): Try[List[A]] = {
???
}
Я продолжаю получать сообщение об ошибке выделения в редакторе IntelliJ на Some(parsedValues)
, в котором говорится: «Выражение типа Some[List[String]] не соответствует ожидаемому типу Option[A]». Мне не удалось понять, как правильно изменить определение функции, чтобы оно удовлетворяло требуемому условию; то есть ошибка уходит.
Если я изменю transformLine
на это (заменю общий параметр A
на Any
)...
transformLine: (Int, List[String]) => Option[Any] =
(index, parsedValues) => Some(parsedValues)
... ошибка исчезает. Но я также теряю строгую типизацию, связанную с общим параметром.
Любая помощь в этом очень ценится.
List[String]
в произвольноеA
? На самом деле это не имеет смысла, если у вас уже нет доказательств для преобразованияList[String]
вA
. Некоторый серьезный рефакторинг с использованием классов типов может сработать, но я не думаю, что имеет смысл больше иметь параметр по умолчанию. - person Michael Zajac   schedule 15.12.2015