55

IntFunction整数配列を返す型の変数があるとします。

IntFunction<int[]> i;

Java 8 ジェネリックでは、次のようなコンストラクタ参照でこの変数を初期化できます。

i = int[]::new

Javaコンパイラはこれをどのようにバイトコードに変換しますか?

のような他の型の場合、特別な意味を持つ単なるメソッドであるString コンストラクターを指す命令をString::new使用できることを私は知っています。invokedynamicjava/lang/String.<init>(...)

配列を構築するための特別な指示があることを見て、これは配列でどのように機能しますか?

4

1 に答える 1

71

Java バイトコードを逆コンパイルすることで、自分自身を見つけることができます。

javap -c -v -p MyClass.class

Foo[]::newコンパイラは、ラムダ ( ) への配列コンストラクター参照を desugari -> new Foo[i]し、他のラムダまたはメソッド参照と同様に処理を進めます。この合成ラムダの逆アセンブルされたバイトコードは次のとおりです。

private static java.lang.Object lambda$MR$new$new$635084e0$1(int);
descriptor: (I)Ljava/lang/Object;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
  stack=1, locals=1, args_size=1
     0: iload_0       
     1: anewarray     #6                  // class java/lang/String
     4: areturn       

(IntFunction の消去された戻り値の型が Object であるため、戻り値の型は Object です。)

于 2015-04-04T15:39:27.780 に答える