У меня следующий абстрактный класса:Scala подразумевается в определении типа функции
abstract class FieldProvider[+T: Writes](db: DB)(implicit i: RequestAction, j: ExecutionContext) {}
и следующие реализации:
class LengthProvider extends FieldProvider ...
object LengthProvider extends ((DB) => LengthProvider) {
def apply(v1: DB): LengthProvider = new LengthProvider(v1)
}
class WidthProvider extends FieldProvider ...
object WidthProvider extends ((DB) => WidthProvider) {
def apply(v1: DB): WidthProvider = new WidthProvider(v1)
}
Причина, почему у меня есть эти apply
методов, потому что мне нужно следующее карту конфигурации:
val providers: Map[String, ((DB) => FieldProvider)] = Map(
"length" -> LengthProvider,
"width" -> WidthProvider
)
Чтобы я мог инициализировать поставщиков по строкам содержащие их название:
providers("length")(db) // returns a new instance of LengthProvider
Теперь проблема заключается в том, что для всех этих конструкторов поставщиков требуются две неявные переменные. Но я не знаю, как включить его в определение функции (DB) => FieldProvider
. Итак, по сути, подпись метода apply
должна быть чем-то вроде (DB)(implicit RequestAction, ExecutionContext) => FieldProvider
, но я не знаю, есть ли правильный синтаксис для того, что я пытаюсь сделать.
Я мог бы также отказаться и передать их в явном виде:
object WidthProvider extends ((DB, RequestAction, ExecutionContext) => WidthProvider) {
def apply(v1: DB, v2: RequestAction, v3: ExecutionContext): WidthProvider = new WidthProvider(v1)(v2,v3)
}
Но тогда я должен буду передать их в явном виде в другом месте, а не providers("length")(db)
, я должен был бы написать providers("length")(db, implicitly[RequestAction], implicitly[ExecutionContext])
, который не чувствует правильно.
Вы перемещаете вещи, которые нуждаются в имплицитах, в меньшую область действия внутри реализации 'LengthProvider'. Вместо того, чтобы использовать их как аргументы конструктора, вы применяете метод для каждого метода. – flavian
Ну, это помогло. Не стесняйтесь публиковать его в качестве ответа, я соглашусь с ним. –
Возможный дубликат [scala typing require implicit] (http://stackoverflow.com/questions/36569881/scala-typing-require-implicit) – cchantep