非法静态接口方法调用

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 可以实现定义冲突方法的接口。