2013-01-18 56 views
0

斯卡拉2.10之前,我有通過調用Java反射構造在斯卡拉2.10

class A { 
    class B(b: Int) { 
    } 
} 

和代碼重新創建B類的地方用

val bCtor = bInstance.getClass.getConstructor(classOf[Int]) 
bCtor.newInstance ... 

,一切都很好。正是有了簽名public A$B(Int)

現在構造有2個!參數。它有一個新簽名public A$B(A,Int)。什麼是類型A的爭論?我無法從我的函數訪問A類。有沒有解決方法?

例如newInstance with arguments - 它不用於內部類

+0

注意添加'A'作爲第一個構造函數參數也是它在爪哇(http://jroller.com/tomdz/entry/reflection_inner_classes)的方式。 –

回答

3

再工作成爲carful不要混淆的java內部類與階路徑依賴型 (從Programming In ScalaBook):

路徑依賴類型類似於Java中的內部類類型的語法,但是存在一個重要區別:路徑依賴類型命名爲外部對象,而內部類類型命名爲外部類

所以你的情況bInstance有關的AINSTANCE。

我的假設是,AINSTANCE是作爲第一個參數給此構造傳遞的對象。

+0

我想用反射重新創建一些類(包括內部)。在2.10之前,我有這樣的能力。悲哀:-( – Ezhik

1

即使從B內(其中this現在引用B實例),您也可以使用無約束的自我類型註釋來引用A的this版本。

package rrs.scribble 

object OuterInner { 
    class Outer { oThis => 
    class Inner { 
     def identify { printf("I am %s; I'm inside of %s%n", this, oThis) } 
    } 
    val inner = new Inner 
    } 

    def oiTest { 
    val o1 = new Outer 
    o1.inner.identify 
    } 
} 

在REPL:

Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_37). 

scala> import rrs.scribble.OuterInner._ 
import rrs.scribble.OuterInner._ 

scala> oiTest 
I am [email protected]; I'm inside of [email protected] 
0

@evantill是正確的B唯一的構造是A$B.<init>(A, Int)。所以bInstance.getClass.getConstructor(classOf[A], classOf[Int])的作品。

+0

最煩人的是我在2.10之前在getClass()中使用了通用構造函數,恕我直言,現在我必須實現類似builder模式的東西,所以我希望有一些技巧可以解決這個新的行爲 – Ezhik

1

首先,加入A作爲第一個構造函數參數也是它在Java的方式:

If this Class object represents an inner class declared in a non-static context, the formal parameter types include the explicit enclosing instance as the first parameter.

其次,

是什麼說法與類型A?我無法從我的函數訪問A類。

如果你有B(從你的例子看來),那麼你可以access its enclosing instance(它似乎並沒有正式文件,因此可以在Java的未來版本的更改):

val aInstance = bInstance.getClass.getDeclaredField("this$0").get(bInstance) 
bCtor.newInstance(aInstance, ...) 

如果你不這樣做,那麼你不能創建B(沒有A),但你不應該能夠。你希望這個代碼返回什麼?

class A(foo: Int) { 
    class B { 
    def bar = foo 
    } 
} 

classOf[A#B].getConstructor().newInstance().bar 
+0

謝謝。其實這是一個拷貝構造函數,所以我不擔心關閉,我的錯誤。 – Ezhik