2011-10-05 31 views
2

階反射,鑄鉛字與asInstanceOf

trait T 
class C extends T 

編譯成.class文件。使用-cp <...>運行scala可以使用T。然後加載使用反射類C:

val loader = ScalaClassLoader fromURLs (/* List[URL] */) 
val anyC = loader.tryToInitializeClass("C") getOrElse (/* throw something */) 
val classC = anyC.asInstanceOf[Class[T]] 

如何我也能投射出classC.newInstanceT型像

val objC = classC.newInstance.asInstanceOf[T] 
// yields java.lang.ClassCastException: C cannot be cast to T 

回答

4

你必須加載類C從不同的類加載器不是一個T正在從加載。

您已將TC放在REPLs類路徑上,因此一個選項是通過系統類加載器加載C。樣品REPL會議,

scala> val loader = scala.tools.nsc.util.ScalaClassLoader.getSystemLoader 
loader: scala.tools.nsc.util.ScalaClassLoader = 
    [email protected] 

scala> val anyC = loader.tryToInitializeClass("C") getOrElse (sys.error("Boom")) 
anyC: Class[Nothing] = class C 

scala> val classC = anyC.asInstanceOf[Class[T]] 
classC: Class[T] = class C 

Nb。這不再是一個真正的Scala特有的問題。

+0

那麼,有什麼方法可以「合併」這兩個類加載器嗎? – classicalist

+0

這真的取決於你想要做什麼。我編輯了答案以顯示一個選項。 –

+0

是的,我想檢查用戶是否實現了提供的「特質」。我找到了方法 'val loader = ScalaClassLoader fromURLs(/ * List [URL] * /,classOf [T] .getClassLoader)' 就是這樣。感謝您的幫助! – classicalist