2012-02-15 4 views
0

Si je pouvais comprendre comment "attacher des manifestes à la pile d'appels générique" (comme Joshua écrit à propos de la section 7.2.2 de "Scala en profondeur"), cela me permettrait-il instancier B le long de ces lignes ?:Scala instanciation à partir des manifestes dans le code générique imbriqué

def m1[T](implicit m: Manifest[T]): T = m.erasure.newInstance.asInstanceOf[T] 

class A { 
    def m2[T](implicit m: Manifest[T]): T = m.erasure.newInstance.asInstanceOf[T] 
    def inA() { 
    m1[A] 
    m2[A] 
    m2[B] // Doesn't work... 
    } 
    class B 
} 

m1[A] 
val a = new A 
a.m2[A] 
a.inA() // boom 

Ou ai-je besoin d'une vue liée?

+1

Que faites-vous? Quelle est l'erreur? Quelle est la question? –

+0

Comment est-ce que je peux instancier une classe imbriquée du type seul? Est-ce une meilleure question? J'ai oublié: je suis sur Scala 2.10.0-M1. L'erreur est: java.lang.InstantiationException: A $ B –

Répondre

1

Vous ne pouvez pas instancier la classe interne B comme ceci, car le constructeur de ces classes internes prend secrètement une référence à un objet de la classe externe. newInstance ne peut être appelée que sur les classes qui ont un constructeur à zéro argument.

+0

Merci. Existe-t-il une autre façon de faire - modèle de construction ou quelque chose? –

+1

Si vous avez un cas où il est logique que vous instanciez une classe interne sans l'instance externe, ce n'est pas vraiment une classe interne. – Landei

+0

B appartiendra à une instance A. C'est juste que j'aimerais pouvoir créer B avec un appel de méthode d'un autre objet comme 'obj.as [B]' au lieu de 'obj.as (nouveau B)'. Le sucre syntaxique devrait reporter la création de B à une superclasse. Comme vous l'avez peut-être deviné, B est un rôle dans un contexte DCI, et conceptuellement, nous ne voulons pas l'impression d'un objet Role distinct, seul un objet Data jouant un Role - un Role Player. C'est pourquoi je veux "cacher" la création du rôle. –

Questions connexes