Java-8允许在接口内部定义静态方法,但restricts仅通过接口名称调用:
9.4:接口可以声明静态方法,无需调用 引用特定对象。
E.g:
interface X {
static void y() {
}
}
...
X x = new X() {};
x.y();
导致错误:
error: illegal static interface method call
x.y();
^
the receiver expression should be replaced with the type qualifier 'X'
通常在JLS中,这种禁令有解释。在这种情况下,我没有发现任何详细的信息。所以我正在寻找对此规则的全面或权威解释:为什么禁止通过特定对象引用调用静态方法?什么打破了?
答案 0 :(得分:17)
一个相当强烈的共识是,对于类的静态方法,不应该允许有问题的语法,但是在实现的时候,改变已经太晚了。对于最近添加的接口方法来说还不算太晚。
此外,允许这种语法会引入钻石问题的可能性,因为类可以实现定义冲突方法的接口。