让我们假设 Java 中的以下场景
public interface Foo {
Object bar();
}
public class Baz implements Foo {
public Object bar() {
//My implementation
}
}
为什么我不能制作Baz.bar()
静态?
这样做会导致编译器错误This static method cannot hide the instance method from Foo
添加@Override
注释以Baz.bar()
将编译器错误更改为The method bar() of type Baz must override or implement a supertype method
在我看来,从使用 interface 的任何人的角度来看Foo
,实现类Baz
仍将满足接口要求,同时使具有静态实现的方法可供任何显式使用Baz
该类而无需实例化的人使用。
为什么编译器不允许这种情况?
编辑:
也许我不够清楚,但我实际上要问的是为什么不允许这样做,因为从我的角度来看,我并没有降低接口定义方法的可见性。
是的,我知道我在标题中使用了抽象这个词,而不是在问题中,但那是因为abstract
关键字隐含在接口中。
编辑 2:
为了清楚说明我为什么要问这个问题,我将添加一个更接近现实的示例:
public interface DatabaseMapper<T extends DatabaseType> {
Entry<T> convert(Entry);
}
public interface SQL extends DatabaseType {}
public class SQLEntry implements Entry<SQL> {}
public class SQLMapper implements DatabaseMapper<SQL> {
public SQLEntry convert(Entry e) {
//Convert some generic entry to the SQLEntry type
}
}
在这种情况下,我想强制所有Mapper
实现都实现该convert
方法,但同时,该方法可能不依赖于SQLMapper
对象的内部状态,并且可能希望能够将泛型Entry
转换为aSQLEntry
无需经过可能包括数据库连接字符串等的实例化过程。
这就是我所面临的情况,以及为什么我想看看是否有人知道为什么用相同的方法无法实现这一点——例如,不必求助于public static SQLEntry convertStatic(Entry e)
被覆盖的方法将其实现委托给的 a。
不过,我再次明白,由于编译器的工作方式,这在 Java 中是不可能的——我只是想理解为什么会这样。