Не столько ответ, сколько объяснение того, почему huynhjl ответ правильный ...
Частично ваше замешательство заключается в том, что вы пытаетесь def
выполнить частичную функцию.Все, что это делает, - это создает метод, который возвращает объект PartialFunction
, когда вы также можете создать его непосредственно:
val pf: PartialFunction[SomeType,AnotherType] = {
case s1:SubType1 => AnotherType(s1.whatever)
case s2:SubType2 => AnotherType(s2.whatever)
}
Хотя я лично предпочитаю использовать тип ascription:
val pf = {
case s1:SubType1 => AnotherType(s1.whatever)
case s2:SubType2 => AnotherType(s2.whatever)
} : PartialFunction[SomeType,AnotherType]
В любом случае, вы должны указать тип ввода, поэтому вы должны дать точную подпись PartialFunction
.Я знаю, что кажется, что можно сделать вывод, но, увы, это, к сожалению, не так!
Используя приписанную версию, вы можете затем определить и поднять все в одном месте:
val pf = ({
case s1:SubType1 => AnotherType(s1.whatever)
case s2:SubType2 => AnotherType(s2.whatever)
} : PartialFunction[SomeType,AnotherType]).lift
PartialFunction.condOpt
является лучшим решением, поскольку он позволяет логическому лицу выполнять большую часть этой работы за вас, оставляя намного более чистый код:)