斯卡拉仍然缺少一个反射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)
这取决于途中阶可以通过加载同伴对象类得到同伴对象的一个实例映射到java类。
圣牛。你知道这个语法是否是Scala规范的固定部分(与语言中的其他任何东西一样固定)?依靠这个似乎是一个糟糕的主意。因为我的目标是让代码更清晰* ...谢谢! – Dave 2009-12-17 11:24:32
正如他所提到的,Scala中没有反射API,所以无论是否包含Scala规范,这都是您执行此操作的唯一方法。 我注意到这个问题/答案已经过了一年多了,这里有什么消息吗? – pdinklag 2011-02-17 05:37:00