为什么我不能在接口中声明静态方法?
该主题说了大部分 - 静态方法无法在接口中声明的原因是什么?
public interface ITest {
public static String test();
}
上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;只允许公共和抽象”。
该主题说了大部分 - 静态方法无法在接口中声明的原因是什么?
public interface ITest {
public static String test();
}
上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;只允许公共和抽象”。
这里有几个问题在起作用。第一个问题是声明静态方法而不定义它的问题。这是区别
public interface Foo {
public static int bar();
}
和
public interface Foo {
public static int bar() {
...
}
}
第一个是不可能的,因为Espo提到的原因:你不知道哪个实现类是正确的定义。
Java可以允许后者;事实上,从Java 8开始,它确实如此!
不能在接口中使用静态方法的原因在于 Java 解析静态引用的方式。Java 在尝试执行静态方法时不会费心查找类的实例。这是因为静态方法不依赖于实例,因此可以直接从类文件执行。假设接口中的所有方法都是抽象的,VM 必须查找接口的特定实现,以便找到静态方法背后的代码,以便可以执行它。这与静态方法解析的工作方式相矛盾,并且会在语言中引入不一致。