2010-08-20 16 views
5

Ben şöyle bir jenerik fabrika oluşturma ile oynuyordum:Örnek bir örnek olmadan genel bir örnek üretmek için scalada bir yol var mı?

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

'yeni T()' derleme değil, T çalışma zamanı kadar tanımlanmamış olduğu gibi. Sınıfın bir örneğini bir yöntemle (örn. CreateInstance (classOf [Tarih])) geçirerek çalışabileceğimi biliyorum. 'New T'nin yerini alabilecek bir iç içe geçme sihirbazı olup olmadığını soruyorum.() 'böylece süper basit fabrikamı oluşturabilir miyim?

cevap

10

Bu çalışacaktır:

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

eğer örneği olan sınıf bir varsayılan (sıfır-arg) yapıcısı vardır.

+0

10 Bu mükemmel cevabı bir özellik ile yapılamayacağına dair bir ipucu olarak ele alacağım. –

+0

Üzgünüm, bunu işaretlemeliydim. "özellikler, içerik sınırlarıyla tür parametrelerine sahip olamaz" (quiler derleyici) –