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

Man*_*DIP 5 java anonymous-class java-8 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Nam*_*man 4

希望这可以帮助您理解,当您声明

I _interface = new C()::imple;
Run Code Online (Sandbox Code Playgroud)

您实际上实现的接口有点类似于(尽管不一样):

I _interface = new I() {
    @Override
    public void test() {
        new C().imple(); // creating an instance of class `C` and calling its 'imple' method
    }
};
Run Code Online (Sandbox Code Playgroud)

因此,当test调用该方法时,它首先创建一个C打印的实例

class x.y.z.C 
Run Code Online (Sandbox Code Playgroud)

作为班级。

因为“this”在测试方法中意味着匿名,对吗?

现在,正如您在上面所看到的,不再有imple 从中调用的匿名类,因此this不再代表匿名类。

正如 Holger 在评论中进一步澄清的那样,尽管在调用站点上表示为 lambda 或匿名类,但无论调用者看起来如何,类this.getClass()的内部方法都C将计算为。C.class

推荐:继续阅读并关注在 Java 中使用 lambda 表达式是否有运行时优势?

  • 说“Supplier<Class<?>> s = () -> getClass();”。`s.get()` 会给你什么?它*不是*一个实现 `Supplier` 的匿名类,或者换句话说,`s.get() != s.getClass()`。因此,按照您在答案中所做的方式将 lambda 表达式重写为内部类将导致错误的假设。 (2认同)