Java 为什么在从默认接口方法调用静态接口方法时不能使用此方法?

Java 为什么在从默认接口方法调用静态接口方法时不能使用此方法?,java,interface,Java,Interface,为什么在接口中时,从默认接口方法调用静态接口方法我不能使用这个.staticInterfaceMethod(),而在常规类中时,从实例方法调用静态类方法使用这个.staticClassMethod()是完全有效的(尽管它的风格不好)? 同时,在接口的默认方法中使用此是完全有效的-我可以合法地执行以下操作: interface I { int MY_CONST = 7; static void st_f() {} default void f1()

为什么在接口中时,从默认接口方法调用静态接口方法我不能使用
这个.staticInterfaceMethod()
而在常规类中时,从实例方法调用静态类方法使用
这个.staticClassMethod()
是完全有效的(尽管它的风格不好)?

同时,在接口的默认方法中使用
是完全有效的-我可以合法地执行以下操作:

interface I {   
    int MY_CONST = 7;   
    static void st_f() {}       
    default void f1() {}

    default void f_demo() {
        this.f1();                  // fine!
        int locvar = this.MY_CONST; // also fine! 

        this.st_f(); // c.ERR:  static method of interface I can only be accessed as I.st_f 
    }
}
“只能对包含接口类的对象调用静态方法。”

实现接口()的类不会从接口继承静态方法。
this
关键字引用当前对象,因此尝试调用
this.staticInterfaceMethod()
将意味着存在一个继承了静态接口方法的对象。这不可能发生;接口本身不能实例化,接口的任何实现都没有继承静态方法。因此,
this.staticInterfaceMethod()
不存在,因此需要在接口本身上调用该方法

关于为什么不继承静态方法的简化解释如下:

public interface InterfaceA {
    public static void staticInterfaceMethod() {
        ...
    }
}

public interface InterfaceB {
    public static void staticInterfaceMethod() {
        ...
    }
}

public class ClassAB implements InterfaceA, InterfaceB {
    ...
}
ClassAB
将继承什么静态方法?这两个静态方法具有相同的签名,因此在调用时无法识别;两人都无法掩盖对方

同时,在接口的默认方法中使用它是完全有效的

允许使用
this
关键字引用默认方法、变量等,因为从接口继承的每个对象都将继承这些属性。

您的答案如下:。参见Brian Goetz的评论:“我们认为通过实例调用静态方法是语言设计错误的能力,不幸的是,我们无法为类反向地修复错误。我们至少不能在接口上犯同样的错误”。