В Scala все еще отсутствует API отражения. Вы можете получить экземпляр объекта-компаньона, загрузив класс объекта-компаньона:
import scala.reflect._
def companion[T](implicit man: Manifest[T]) : T =
man.erasure.getField("MODULE$").get(man.erasure).asInstanceOf[T]
scala> companion[List$].make(3, "s")
res0: List[Any] = List(s, s, s)
Чтобы получить нетипизированный объект-компаньон, вы можете использовать класс напрямую:
import scala.reflect.Manifest
def companionObj[T](implicit man: Manifest[T]) = {
val c = Class.forName(man.erasure.getName + "$")
c.getField("MODULE$").get(c)
}
scala> companionObj[List[Int]].asInstanceOf[List$].make(3, "s")
res0: List[Any] = List(s, s, s)
Это зависит от того, как scala отображается на классы java.