非法静态接口方法调用
Illegal static interface method call
Java-8 允许在接口内部定义静态方法,但 restricts 它仅通过接口名称调用:
9.4: An interface can declare static methods, which are invoked without
reference to a particular object.
例如:
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这样的禁令都有解释。在这种情况下,我没有找到任何详细信息。所以我正在寻找这个规则的全面或权威的解释:为什么禁止通过特定对象引用调用静态方法?它破坏了什么?
一个相当强烈的共识是,在 classes 上也不应该允许静态方法使用所讨论的语法,但是当意识到这一点时,改变已经太迟了。对于最近添加的接口方法来说还不算太晚。
此外,允许这种语法会引入菱形问题的可能性,因为 class 可以实现定义冲突方法的接口。
Java-8 允许在接口内部定义静态方法,但 restricts 它仅通过接口名称调用:
9.4: An interface can declare static methods, which are invoked without reference to a particular object.
例如:
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这样的禁令都有解释。在这种情况下,我没有找到任何详细信息。所以我正在寻找这个规则的全面或权威的解释:为什么禁止通过特定对象引用调用静态方法?它破坏了什么?
一个相当强烈的共识是,在 classes 上也不应该允许静态方法使用所讨论的语法,但是当意识到这一点时,改变已经太迟了。对于最近添加的接口方法来说还不算太晚。
此外,允许这种语法会引入菱形问题的可能性,因为 class 可以实现定义冲突方法的接口。