Почему Скала должен дублировать конструктор? (ява.яз..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   3  

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