我通过在公共static void main()方法内实现接口I创建了匿名类。因此,通过Java 8的抽象方法test(),实现是从类C的imple()方法提供的。
因此,在public static void main()方法内部,打印_interface.getClass(),我得到了
package_path.Main $$ Lambda $ 1/310656974这绝对好。因为它打印的是匿名类名。
此外,_interface指向堆中的一个匿名对象,因此我正在执行_interface.test();
因此,test()方法现在具有的第一条语句是打印类名称,
但是最终打印出来的是 package_path.C(告诉我C是类名)。那怎么可能?不应再次打印package_path.Main $$ Lambda $ 1/310656974吗?因为“这”意味着在测试方法内部是匿名的吗?
@java.lang.FunctionalInterface
interface I {
void test();
}
class C {
void imple() {
System.out.println(this.getClass());
System.out.println("Inside Implementation");
}
}
class Main {
public static void main(String[] args) {
I _interface = new C()::imple;
System.out.println(_interface.getClass());
_interface.test();
}
}
答案 0 :(得分:4)
希望这可以帮助您理解,当您声明
I _interface = new C()::imple;
您实际上已经实现了与(though not same as)类似的接口:
I _interface = new I() {
@Override
public void test() {
new C().imple(); // creating an instance of class `C` and calling its 'imple' method
}
};
因此,在调用test
方法时,它将首先创建C
的实例并打印
class x.y.z.C
作为课程。
因为“这”意味着在测试方法内部是匿名的吗?
现在您可以在上方看到, imple
不再包含匿名类
是从中调用的,因此this
不再代表匿名类。
正如Holger在评论中进一步阐明的那样,尽管在调用站点上表示为lambda或匿名类,但在this.getClass()
类方法中的C
仍将计算为C.class
呼叫者的样子。
推荐:继续阅读并继续关注Is there any runtime benefit of using lambda expression in Java?