JLS
15.12.1。确定了两个原因,为什么一个方法可以“在范围内”:
- “ …有一个该方法是其成员的封闭类型声明”
- “ …由于一个或多个单一静态导入…”
现在有两个因素导致了令人惊讶的结果:
- 此时,仅考虑方法的名称,稍后再签名。
- 上面提到的两个替代方案都与“否则”联系在一起。在第一种情况下,我们最终查看了可见方法的封闭类。在第二种情况下,我们使用静态导入。
“否则”意味着搜索范围仅限于尝试两个分支中的任何一个。首先,我们必须决定是搜索封闭类型还是使用静态导入。封闭类型具有更高的优先级,我们找到名称正确的方法(Test.defaultIfNull()),搜索到此结束。稍后,当我们发现此方法不兼容时,就没有回去尝试静态导入了。
在JLS中这种情况并不少见,方法查找的其他问题也分阶段进行,其中一个阶段的部分匹配可能会阻止在后续阶段中找到更好的匹配。固定对数与可变对数匹配是此概念的另一个示例。在所有情况下,结果是编译器不会搜索整个可能的解决方案空间,但是在做出某些决定后,整个分支将被切断并且永远不会被访问。
可以从上面得出一个经验法则:重载只能在相同类型层次结构的方法之间进行选择,而不能在与继承无关的类型方法之间进行选择。



