Почему Скала должен дублировать конструктор? (ява.яз..NoSuchMethodException)
Я получал эту ошибку в моей работе Hadoop.java.lang.NoSuchMethodException: <PackageName>.<ClassName>.<init>(<parameters>)
В большинстве Scala-кодов он появляется во время компиляции. Но так как эта работа вызывается во время выполнения, я не ловил ее во время компиляции.
Я думаю, что параметр default вызовет создание конструкторов с обеими сигнатурами, один из которых принимает один аргумент.
class BasicDynamicBlocker(args: Args, evaluation: Boolean = false) extends Job(args) with HiveAccess {
//I NEEDED THIS TOO:
def this(args: Args) = {
this(args, false)
}
... }
Я узнал на собственном горьком опыте, что мне нужно объявить перегруженный конструктор с помощью this
. (Я хотел записать это на всякий случай. помогает кому-то другому.)
У меня тоже есть небольшие вопросы. Это все еще кажется мне излишним. Есть ли причина, по которой ограничения дизайна языка Scala требуют этого?
1 ответ:
Это не похоже на то, когда у вас есть параметр по умолчанию, вы получите перегрузки, генерируемые для каждого возможного случая, например:
def method(num: Int = 4, str: String = "") = ???
Вы ожидаете, что компилятор сгенерирует
def method(num: Int) = method(num, "") def method(str: String) = method(4, str) def method() = method(4, "")
, но это не так.
Вместо этого вы создадите методы (в сопутствующем объекте) для каждого параметра по умолчанию
def method$default$1: Int = 4 def method$default$2: String = "a"
И всякий раз, когда вы говорите в своем коде
method(str = "a")
Он будет просто изменен на
method(method$default$1, "a")
Так что в вашем случае конструктора с сигнатурой
this(args: Args)
просто не было существует, была только версия 2 param.Вы можете прочитать больше здесь: http://docs.scala-lang.org/sips/completed/named-and-default-arguments.html