Я пытаюсь реализовать/переопределить функцию с пустым входным аргументом, используя частичную функцию. Лучше всего это объясняется этим неработающим минимальным примером:
trait T
trait TFactory {
def build(): T
}
class A(someParameter: Int) extends T
object A extends TFactory {
def build(someParameter: Int)(): T = new A(someParameter)
}
Компилятор жалуется: object creation impossible, since method build in trait TFactory of type ()T is not defined
, что логично, так как тип сборки (Int)()T
. Моей следующей идеей было сделать тип build
явным образом для функции, принимающей пустой аргумент и возвращающей T
, то есть:
trait T
trait TFactory {
def build: () => T // what about empty parenthesis after build?
}
class A(someParameter: Int) extends T
object A extends TFactory {
def build(someParameter: Int): (() => T) = (() => new A(someParameter))
}
Теперь очевидно, что тип build
— это () => T
. К моему удивлению, компилятор теперь жалуется на object creation impossible, since method build in trait TFactory of type => () => T is not defined
(обратите внимание, что тип неожиданно начинается с =>
). Отчаянное добавление пустых скобок в конце определения(й) функции также не помогает.
Как я могу убедить свой компилятор, что эти типы на самом деле одинаковы?
Пояснение:
Моя основная цель — добиться инициализации T
без параметров без необходимости фабрики для фабрик. Пример:
val t = A(33).build() // if this is possible, I though it might be possible to have:
val t = A.build(33)()
Вывод:
Я думаю, что это просто невозможно, потому что абстрактная функция просто определяет, сколько блоков аргументов должна принимать функция build
. Другими словами: вы не можете реализовать абстрактную функцию с помощью функции, чье частичное приложение имеет ту же сигнатуру, что и функция, которую вы пытаетесь реализовать.
build
состоит в том, чтобы ничего не принимать в качестве входных данных и возвращать новый экземплярT
. Намерение реализации вobject A
состоит в том, чтобы просто обернуть все необходимые параметрыA
, позволяя инициализацию без параметров. - person bluenote10   schedule 11.12.2013