为什么我不能使用已实现接口的静态方法?

hos*_*yni 18 java inheritance static-methods interface java-8

正如您所知,在Java 8中,接口可以拥有静态方法,这些方法本身就具有实现.

正如我在相关教程中所读到的,实现此类接口的类可以使用其静态方法.但是,我有一个问题,在这里,我用一个比我更简单的例子来展示它

public interface Interface1{
    public static void printName(){
        System.out.println("Interface1");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我实现这样的接口

public class Class1 implements Interface1{
    public void doSomeThing() {
        printName();
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到编译错误.

The method printName() is undefined for the type Class1
Run Code Online (Sandbox Code Playgroud)

有什么问题?

Sot*_*lis 24

从Java语言规范,

类C从其直接超类继承超类的所有具体方法m(静态和实例),以下所有条件都为真:

  • [...]

类C继承自其直接超类和直接超接口所有抽象和默认(§9.4)方法m,其中所有以下都是真的:

  • [...]

类不会从其超接口继承静态方法.

所以该方法不是继承的.

您可以静态导入该成员

import static com.example.Interface1.printName;
...
printName();
Run Code Online (Sandbox Code Playgroud)

或者使用完全限定的类型名称

com.example.Interface1.printName();
Run Code Online (Sandbox Code Playgroud)

或者导入printName属于的类型并使用其短名称调用它

import static com.example.Interface1;
...
Interface1.printName();
Run Code Online (Sandbox Code Playgroud)

  • 更一般地说......这反映了类和接口中静态方法处理之间的(有意)不对称 - 类中的静态方法由子类型继承,但接口中的静态方法不是.这是一个经过仔细考虑的决定; 毕竟,像OPs这样的混淆问题是引入这种不对称的自然结果.然而,EG强烈认为类中静态方法的现有继承本质上是一个设计错误,并且将其扩展到接口会产生许多令人困惑的多继承角情况,几乎没有什么好处. (15认同)