trait Factory[T] { def createInstance():T = new T() } val dateFactory = new Factory[Date](){} val myDate = dateFactory.createInstance()
5
0
次のように汎用ファクトリーを作成して遊んでいた:
trait Factory[T] { def createInstance():T = new T() } val dateFactory = new Factory[Date](){} val myDate = dateFactory.createInstance()
Tは実行時まで未定義なので、「新しいT()」はコンパイルされません。 クラスのインスタンスを何らかのメソッドに渡すことで動作することを知っています(つまり、 createInstance(classOf [Date]))
超シンプルなファクトリーを作成できるように、「new T()」を置き換えることができるイントロスペクションのマジックがあるかどうかを尋ねていますか?
1 Answer
10
これは動作します:
class Factory[T : ClassManifest] { def createInstance(): T = (implicitly[ClassManifest[T]]).erasure.newInstance.asInstanceOf[T] }
_if_インスタンス化されるクラスには、デフォルト(引数ゼロ)コンストラクターがあります。