gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:05 24 4
gpt4 key购买 nike

我通过在 public static void main() 方法中实现接口(interface) I 创建了匿名类。因此,对于抽象方法 test() 的 java 8,实现是由类 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 吗?因为“this”在测试方法中意味着匿名,对吧?

@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();
}
}

最佳答案

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

I _interface = new C()::imple;

您实际上实现了类似于 ( though not same as) 的接口(interface):

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 

作为类(class)。

Because 'this' means anonymous inside the test method right?

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

正如 Holger 在评论中进一步阐明的那样,尽管在调用站点表示为 lambda 或匿名类, this.getClass()在类的方法内 C将评估为 C.class ,不管来电者长什么样。

推荐:继续阅读并关注 Is there any runtime benefit of using lambda expression in Java?

关于java - 为什么 this.getClass 给它自己的类名而不是匿名类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56310757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com