gpt4 book ai didi

java - 隐式 "this"在匿名类中指的是什么?

转载 作者:行者123 更新时间:2023-12-01 21:26:25 25 4
gpt4 key购买 nike

在下面的代码中,我注意到我可以调用 getWorld() 而无需引用 HelloWorld 对象?但是隐式的“this”关键字现在不是指的是内部匿名类吗?如果是这样,为什么我能够调用 getWorld()?

public class HelloWorld {
public void getWorld() {
this.setListener(new MyListenerInterface(){
@Override
public void innerMethod() {
getWorld();
}
});
}
}

忽略代码中的递归。

最佳答案

答案在 Section 15.12 of the JLS .

If it is a simple name, that is, just an Identifier, then the name of the method is the Identifier.

If the Identifier appears within the scope of a visible method declaration with that name (§6.3, §6.4.1), then:

  • If there is an enclosing type declaration of which that method is a member, let T be the innermost such type declaration. The class or interface to search is T.

通过仅使用方法的简单名称,调用哪个方法的解析会在封闭的方法中查找,直到找到具有该名称的方法,然后尝试使用该方法(或多个方法)来找到完全匹配的内容。

这与使用 this.getWorld() 的情况不同,因为 this 明确引用内部类实例。这会导致不同类型的解析(规范的 Typename . Identifier 部分,位于链接引用的下方),它不会查看封闭的外部类。

这样做的一个有趣的结果是,您可以通过向具有相同名称但不同数量的内部类添加一个方法来导致代码停止编译。由于当它尝试确定要解析的类实例时,它仅搜索名称本身,因此它将尝试使用内部类,但不会找到完全匹配的方法。

所以这个:

public class HelloWorld {
public void getWorld() {
this.setListener(new MyListenerInterface(){
@Override
public void innerMethod() {
getWorld();
}
void getWorld(int i){}
});
}
}

无法编译。方法名称解析将在内部类中发现 getWorld,因此将停止向上搜索层次结构。但是当它尝试进行数量解析时,它会发现类中没有一个 getWorld 方法匹配,并且会失败。

TL;DR - 仅使用简单名称与使用 this.method() 完全相同,尽管它通常评估为相同的东西。语言规范有处理这种情况的特定规则,这可以允许它在任何封闭的实例中查找匹配的方法。

关于java - 隐式 "this"在匿名类中指的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38109302/

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