web-dev-qa-db-ja.com

Java 7で拡張されるインターフェースのメソッドをインターフェースがオーバーライドするのはなぜですか?

私は Map および SortedMap Java 7からのドキュメントを見ていて、SortedMapMapは、entrySet()keySet()およびvalues()をオーバーライドします。

AFAIK、インターフェイスはJavaの前にJava 8.で)メソッドを実装できません。これらのメソッドをオーバーライドする理由は何でしたか?

7
Utku

異なるドキュメントを提供できるように、メソッドが単にオーバーライドされているように見えます。

3つの方法すべてについて、ドキュメンテーションの唯一の違いは、SortedMapバージョンが「セットのイテレータがキーの昇順でエントリを返す」ことを追加することです。メインの説明に、「キーの昇順でソートされて」戻り値の説明に。


追伸明らかなフォローアップの質問は、これらの3つのメソッドシグネチャがSortedSetではなくSetを返すように変更されなかった理由です。 Java言語はこの種の変更を許可しているようで、SortedSetの追加のメソッドを実装するのは簡単であるように思われるため、残念ながら私はこれの理由を思い付くことができません。

6
Ixrec

Java 7)のJava言語仕様 から:

メソッドのシグネチャを確認する以外に、オーバーライドするメソッド宣言によって実行できるすべてのことは、戻り値の型を調整するか、メソッドの実装によってスローされる可能性のある例外を制限することです。

したがって:throws署名を変更したり、元の戻り値の型のより具体的なサブ型を指定したりできます。例えば:

interface Foo {
  Foo get() throws IOException;
}

interface Bar extends Foo {
  Bar get() throws RuntimeException;
}

どちらか一方のthrows句を完全に省略しているように、完全に合法です。

3
justinpitts

(Java 7)で)親インターフェースメソッドを「オーバーライド」できるインターフェースメソッドなどはないと思います。「オーバーライド」メソッドを持つことができるのは(サブ)クラスだけです。 SortedMapとMapはクラスではなくインターフェイスであるため、表示されているのは技術的な問題ではなく、単なるドキュメントの問題です。

(そして、サブインターフェイスによるオーバーロードは別の話ですが、引用しているメソッドは同じシグネチャを持っているため、オーバーロードではありません。)

0
Erik Eidt