«Неизменяемая замена шаблона стиля 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
Вы можете определить новые классы или черты с помощью интерпретатора на лету. Метод Interpret преобразует код Scala в байт-код.
Вы уже упомянули ScalaSigParser , с которым не совсем легко работать.
Я думаю, что остальные функции, которые вам нравятся, еще не созданы.