2012-02-15 58 views
0

如果我能弄清楚如何「將清單附加到泛型調用堆棧」(正如Joshua在「Scala深度」的第7.2.2節中所述),是否可以使我實例化B沿着這些線?:來自嵌套泛型代碼清單的Scala實例化

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

你在做什麼?什麼是錯誤?什麼是問題? – 2012-02-15 12:15:23

+0

如何從類型實例化一個嵌套類?這是一個更好的問題嗎?忘記了:我在Scala 2.10.0-M1上。錯誤是:java.lang.InstantiationException:A $ B – 2012-02-15 12:18:20

回答

1

無法實例內部類B這樣的,因爲這樣的內部類的構造函數偷偷花費外部類的一個對象的引用。 newInstance只能在具有零參數構造函數的類上調用。

+0

謝謝。有沒有其他的方法 - 建設者模式或什麼? – 2012-02-15 12:22:47

+1

如果您有一種情況,您可以實例化一個沒有外部實例的內部類,而不是真正的內部類。 – Landei 2012-02-15 14:19:48

+0

B將屬於一個實例。這只是我希望能夠通過另一個對象的方法調用來創建B,比如'obj.as [B]'而不是'obj.as(new B)'。語法糖應該將B創建推遲到超類。正如你可能已經猜到的那樣,B是DCI上下文中的一個角色,從概念上講,我們不想要一個單獨的角色對象的印象,只有一個扮演角色角色扮演者的數據對象。這就是爲什麼我要「隱藏」角色創建。 – 2012-02-15 15:58:16