19

以下のようなインターフェースを定義すると

interface I1{

}

次のように書くことができる任意のコードセクションで

I1 i1;
i1.equals(null);

次に、equals メソッドがどこから来るのか、インターフェイスはスーパー クラス Object も拡張しますか? その場合、インターフェイスはどのようにクラスを拡張できますか?

インターフェースがスーパークラス Object を拡張すると仮定すると、 Set のようなコレクションインターフェースが equals() および hashCode() メソッドを定義しなければならない理由がわかりますか? すべてのクラスは Object クラスを拡張するため、 Object クラスに存在するインターフェイスで抽象メソッドを定義すると、インターフェイスを実装する人はそれらのメソッドを実装する必要がなくなります。以下のコードのように

interface I1{
String toString();
}

class A implements I1{

}

ここで、クラス A は Object クラスに存在するため、メソッド toString() を実装する必要はありません。次に、実装クラスにそれらのメソッドを実装させることはできないため、コレクションインターフェイスでこれらのメソッドを定義する目的は何ですか。

4

3 に答える 3

36

次に、equals メソッドがどこから来るのか、インターフェイスはスーパー クラス Object も拡張しますか? その場合、インターフェイスはどのようにクラスを拡張できますか?

Java 言語仕様では、これを明示的に扱っています。

セクション9.2から:

インターフェイスに直接のスーパーインターフェイスがない場合、インターフェイスは、署名 s、戻り値の型 r、および throws 句 t を持つ各パブリック インスタンス メソッド m に対応する、シグネチャ s、戻り値の型 r、および throws 句 t を持つパブリック抽象メンバー メソッド m を暗黙的に宣言します。ただし、同じシグネチャ、同じ戻り値の型、および互換性のある throws 句を持つメソッドがインターフェイスによって明示的に宣言されている場合を除きます。

基本的に、これはなどを使用できるequalsようにするためhashCodeのものです。Java 言語が指定される方法は、インターフェイスの具体的な実装がクラスになることを意味し、そのクラス最終的に のサブクラスでなければならないObjectため、メンバーは間違いなく現在。

別の言い方をすれば、インターフェイス自体は拡張されませんがObject、どの実装でも拡張されることが知られています。

ここで、クラス A は Object クラスに存在するため、メソッド toString() を実装する必要はありません。次に、実装クラスにそれらのメソッドを実装させることはできないため、コレクションインターフェイスでこれらのメソッドを定義する目的は何ですか。

通常、これは明確にするために行われます。たとえば、 で宣言されたメンバーに関して実装に期待されることを文書化するためObjectです。

于 2012-12-08T09:04:54.703 に答える
3

すべてのクラスは暗黙的に拡張Objectされ、Object クラスのすべての (非プライベート) メソッドを継承します。

すべてのインスタンスにはクラスがあるため、Object のすべてのメソッドがあります。

インスタンスがインターフェースを実装するかどうかは、この時点ではまったく関係ありません。

オブジェクトはクラスであり、インターフェースはクラスを拡張できないため、「いいえ」 - インターフェースはどのクラスからも何も継承しません。

于 2012-12-08T09:05:05.190 に答える