斯卡拉仍然缺少一個反射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