2012-02-15 6 views
0

「ジェネリックコールスタックのマニフェストを添付する方法」を理解することができたら(Joshuaが「Scala in Depth」の7.2.2項に書いているように)それらの線に沿ってBをインスタンス化しますか?:ネストされたジェネリックコードのマニフェストからのスカラのインスタンス化

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 

ビューバインドが必要ですか?

+1

あなたは何についてですか?エラーは何ですか?質問は何ですか? –

+0

どのようにして、型だけから入れ子になったクラスをインスタンス化できますか?それは良い質問ですか?忘れました:私はScala 2.10.0-M1です。エラーは次のとおりです。java.lang.InstantiationException:A $ B –

答えて

1

内部クラスBをインスタンス化することはできません。そのような内部クラスのコンストラクタは、外部クラスのオブジェクトへの参照を密かに取るためです。 newInstanceは、引数のないコンストラクタを持つクラスに対してのみ呼び出すことができます。

+0

ありがとうございます。ビルダーのパターンや何か別の方法がありますか? –

+1

外部インスタンスを持たない内部クラスをインスタンス化することが理にかなっている場合は、内部クラスではありません。 – Landei

+0

BはAインスタンスに属します。それは、obj.as(new B)の代わりに 'obj.as [B]'のような別のオブジェクトのメソッド呼び出しでBを作成できるようにすることです。構文上の砂糖は、Bの作成をスーパークラスに委ねるべきです。あなたが推測したように、BはDCIコンテキストの役割であり、概念的には、別のRoleオブジェクト、つまりRoleを演奏するDataオブジェクト、つまりRole Playerという印象を望まないのです。だからこそ私は役割の創造を「隠す」ためです。 –

関連する問題