0

Scala2.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-内部クラスでは機能しなくなりました

4

4 に答える 4

3

java内部クラスをscalaパス依存型( Programming In ScalaBookから)と混同しないように注意してください:

パス依存型はJavaの内部クラス型の構文に似ていますが、決定的な違いがあります。パス依存型は外部オブジェクトに名前を付けますが、内部クラス型は外部クラスに名前を付けます。

したがって、あなたの場合、bInstanceはaInstanceに関連しています。

私の仮定では、aInstanceは、このコンストラクターに最初のパラメーターとして渡されるオブジェクトです。

于 2013-01-18T14:57:14.163 に答える
1

制約のない自己型アノテーションを使用して、thisB内からでもAのバージョンを参照する方法を使用できます(this現在はBインスタンスを参照しています)。

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 rrs.scribble.OuterInner$Outer$Inner@63d0d313; I'm inside of rrs.scribble.OuterInner$Outer@22d1b797
于 2013-01-18T15:06:16.837 に答える
1

Aまず、最初のコンストラクター引数として追加することも、Javaで機能する方法です。

このClassオブジェクトが非静的コンテキストで宣言された内部クラスを表す場合、仮パラメータータイプには、最初のパラメーターとして明示的な囲みインスタンスが含まれます。

2番、

タイプAの引数とは何ですか?関数からAクラスにアクセスできません。

B(例からわかるように)を持っている場合は、それを囲むインスタンスにアクセスできます(公式に文書化されていないようであるため、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
于 2013-01-19T04:31:15.800 に答える
0

@evantillは正しいです、の唯一のコンストラクターはBですA$B.<init>(A, Int)。だからbInstance.getClass.getConstructor(classOf[A], classOf[Int])動作します。

于 2013-01-18T15:11:03.867 に答える