- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的代码中,我注意到我可以调用 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/
在我的应用程序中,我想检测手指按在屏幕上的类型。触摸类型可能是单点触摸或多点触摸。我搜索了很多,但找不到任何东西。 有什么方法可以找到类型吗? 最佳答案 不可能知道哪个手指在某个点,但您肯定可以获得每
以下代码是我一直在尝试用于多点触控的代码。手指一设置正确并在我拖动手指时四处移动。当我触摸并松开手指时,第二个手指出现并消失,但它永远不会移动。知道有什么问题吗? 我已阅读 developers bl
我是一名优秀的程序员,十分优秀!