2010-08-20 37 views
5

Je joue avec la création d'une usine générique comme suit:Y a-t-il un moyen dans scala de produire une instance générique sans exemple d'instance?

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

Le «nouveau T() ne compile pas, comme T est définie avant l'exécution. Je sais que je peux le faire fonctionner en passant dans une instance de la classe à une méthode (ie createInstance (classOf [Date]))

Je demande s'il y a une magie d'introspection qui pourrait remplacer 'new T() 'pour que je puisse créer mon usine super simple?

Répondre

10

Cela fonctionne:

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

si la classe pour laquelle il est instancié a un constructeur par défaut (zéro-arg).

+0

Je vais prendre cette excellente réponse comme un indice que cela ne peut pas être fait avec un trait. –

+0

Désolé, j'aurais dû le signaler. "les traits ne peuvent pas avoir de paramètres de type avec des limites de contexte" (quoth le compilateur) –