Ответ 1
"Неизменяемая замена шаблона стиля JavaBean" может быть выражена именованными параметрами и, возможно, аннотацией @BeanProperty:
import reflect._
case class A(@BeanProperty val x: String, @BeanProperty val y : Int)
A(x = "s", y = 3)
A(y = 3, x = "s")
Добавление методов (точнее: определение нового интерфейса) имеет смысл только в статически типизированном языке, если клиент знает о новых методах и может скомпилировать его с интерфейсом. С помощью структурной типизации клиенты могут определять методы, которые они ожидают присутствовать в объекте. Компилятор Scala преобразует структурный тип в код отражения, который может выйти из строя во время выполнения.
type T = {def go(x : Int): Int }
def y(any : Any) = any.asInstanceOf[T].go(2)
class A{
def go(x : Int) = x + 1
}
y(new A())
y(new {}) //this will fail
Вы можете определить новые классы или черты с помощью interpreter на лету. Метод Interpret преобразует код Scala в байтовый код.
Вы уже упоминали ScalaSigParser, с которым работать нелегко.
Я думаю, что остальная часть функций, которые вам нравятся, еще не существует.