2010-08-20 87 views
5

我是用如下創建一個通用的工廠打:在沒有示例實例的情況下,scala中是否有方法來生成一個通用實例?

trait Factory[T] { def createInstance():T = new T() } 
val dateFactory = new Factory[Date](){} 
val myDate = dateFactory.createInstance() 

「新T()」不能編譯,因爲T是不確定的,直到運行時。我知道我可以通過在類的實例中傳遞一些方法來實現它(例如createInstance(classOf [Date]))

我在問是否有一些內省魔法可以替代'new T ()「,以便我可以創建我的超級簡單工廠?

回答

10

這將工作:

class Factory[T : ClassManifest] { 
    def 
    createInstance(): T = 
    (implicitly[ClassManifest[T]]).erasure.newInstance.asInstanceOf[T] 
} 

如果,這就是它實例化的類有一個默認的(零ARG)構造函數。

+0

我打算把這個優秀的答案作爲一個線索,它不能用一個特質來完成。 – 2010-08-21 05:20:50

+0

對不起,我應該指出的。 「特徵不能有帶上下文邊界的類型參數」(編譯器) – 2010-08-21 05:48:47

相關問題