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
含むSQLEntry
インスタンス化プロセスを経ずに。
これが私が直面したシナリオであり、同じ方法でこれを達成できない理由を誰かが知っているかどうかを確認したかった理由です。たとえばpublic static SQLEntry convertStatic(Entry e)
、オーバーライドされたメソッドが実装を委譲する に頼る必要がないなどです。
繰り返しますが、コンパイラの仕組みが原因で Java ではこれが不可能であることを理解しています。