Java 8 引入了对一等函数的支持,它允许将函数分配给变量。在这种情况下,变量必须是函数类型,由函数接口(只有一个抽象方法的接口)定义。
因此,考虑具有以下定义的接口I
和类的示例:A
interface I{ int foo(); }
class A implements I{
public int foo(){return 7;}
public static int bar(){return 11;}
}
我们可以为类型的变量分配I
的实例A
或方法的方法引用bar
。A
两者都可以存储在 type 的变量中I
,例如:
I i1 = new A();
I i2 = A::bar;
如果我们分析之前代码编译产生的字节码,我们将得到:
0: new #2 // class A
3: dup
4: invokespecial #3 // Method A."<init>":()V
7: astore_1
8: invokedynamic #4, 0 // InvokeDynamic #0:foo:()LI;
13: astore_2
因为i1 = new A();
很明显,相应的指令7: astore_1
正在存储一个A
与I
. 但是,由于i2 = A::bar
我们正在存储8: invokedynamic #4, 0
.
那么,这意味着 an 的结果invokedynamic
始终是目标类型的实例,即我们使用方法引用分配的变量的类型?