2012-05-21 34 views
1

使用Scala一些擺弄後,我來到了這個解決方案從給定的類型創建新的對象獲得從類型名稱類型Scala中

object Entity { 

    def get[T <: Entity: ClassManifest]: T = { 

     val entity = implicitly[ClassManifest[T]].erasure.getConstructors()(0).newInstance().asInstanceOf[T] 

     /** some stuff **/ 

     entity 

    } 

} 

abstract class Entity { 

} 

class Implementation extends Entity { 

} 

,然後使用:

var e = Entity.get[Implementation] 

我的問題

  1. 是好的還是有一些不同的方式做到這一點(我現在使用Scala 2.9.2)?

  2. 有沒有像Class.forName允許從其名稱獲取類型的東西? (或者更一般地,我可以用類型變量?)

回答

0

或者,您可以通過Class[T]

object Entity { 
    def get[T <: Entity](e: Class[T]): T = { 
    val entity = e.getConstructors()(0).newInstance().asInstanceOf[T] 
    /** some stuff **/ 
    entity 
    } 
} 

var e1 = Entity.get(classOf[Implementation]) 

您可以使用Class.forName,但你會失去類型安全(因爲字符串className可以是任何東西,而不僅僅是一個實體子類),我認爲你的返回類型必須是Entity

+0

'Class.forName'將返回'Class',而不是'Entity'的實例,所以這總是會失敗。 –

7

因此,StackOverflow的問題之一是,沒有人會給我點「哇,這很聰明,爲了上帝的緣故,永遠不要這樣做或任何類似的東西」。儘管如此,作爲一名高級架構師,這似乎是我的大部分工作。

如果您使用外部反射或庫,或者作爲與庫進行交互的原因,您做錯了。所以停下來。

+2

是的,先生,隊長先生!向我致敬,先生! –

+0

現在,嚴重的是,它有什麼不妥之處? –