Как видно из ответа extempore , возможна перегрузка. Комментарий Даниэля о проектном решении является правильным, но, я думаю, неполным и немного вводящим в заблуждение. Нет запретов перегрузок (поскольку они возможны), но их нелегко достичь.
Проектные решения, которые приводят к этому:
- Все предыдущие определения должны быть доступны.
- Компилируется только недавно введенный код, вместо перекомпиляции всего, что когда-либо вводилось каждый раз.
- Должна быть возможность переопределить определения (как упоминал Даниил).
- Должна быть возможность определять такие элементы, как vals и def, а не только классы и объекты.
Проблема в том ... как достичь всех этих целей? Как мы обработаем ваш пример?
def foo(x: Int): Unit = {}
def foo(x: String): Unit = {println(foo(2))}
Начиная с 4-го элемента, A val
или def
можно определить только внутри class
, trait
, object
или package object
. Таким образом, REPL помещает определения в объекты, как это ( не фактическое представление! )
package $line1 { // input line
object $read { // what was read
object $iw { // definitions
def foo(x: Int): Unit = {}
}
// val res1 would be here somewhere if this was an expression
}
}
Теперь, из-за того, как работает JVM, после того, как вы определили один из них, вы не сможете их расширить. Конечно, вы можете перекомпилировать все, но мы отказались от этого. Так что вам нужно разместить его в другом месте:
package $line1 { // input line
object $read { // what was read
object $iw { // definitions
def foo(x: String): Unit = { println(foo(2)) }
}
}
}
И это объясняет, почему ваши примеры не являются перегрузками: они определены в двух разных местах. Если вы поместите их в одну строку, все они будут определены вместе, что приведет к их перегрузкам, как показано в примере extempore.
Что касается других проектных решений, то каждый новый пакет импортирует определения и «res» из предыдущих пакетов, а импорт может дублировать друг друга, что позволяет «переопределять» материал.