当前位置:  开发笔记 > 编程语言 > 正文

非法的静态接口方法调用

如何解决《非法的静态接口方法调用》经验,为你挑选了1个好方法。

Java-8允许在接口内部定义静态方法,但仅通过接口名称限制它的调用:

9.4:接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用.

例如:

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中,这种禁令有一个解释.在这种情况下,我没有发现任何详细的信息.所以我正在寻找对此规则的全面或权威解释:为什么禁止通过特定对象引用调用静态方法?它打破了什么?



1> chrylis -on ..:

这是一个相当强烈的共识,即对于类的静态方法,不应该允许有问题的语法,但是到了实现的时候,改变已经太晚了.对于最近添加的接口方法来说还不算太晚.

另外,允许这种语法会引入钻石问题的可能性,因为类可以实现定义冲突方法的接口.


这种分析是正确的.我们认为通过实例调用静态方法的能力是一种语言设计错误,遗憾的是我们无法追溯到类.我们至少可以犯同样的错误.(有时候我们选择在扩展语言时刻意"犯同样的错误",选择与局部改进相一致的一致性 - 但是选择涉及判断"好吧,改善程度有多好?"这里,差异很大足够.)
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有