为什么this.getClass给出自己的类名而不是匿名类名?

时间:2019-05-26 04:56:57

标签: java java-8 anonymous-class functional-interface

我通过在公共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();
    }
}

1 个答案:

答案 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?