1

主にHashBagクラスにアクセスしたかったので、ApacheCommonsを初めて使用します。問題を特定するために、私が従ったプロセス全体の概要を説明します。

まず、Apache CommonsCollectionsの現在のバージョン(3.2.1)をダウンロードしました。 http://commons.apache.org/collections/download_collections.cgi

次に、ファイルをディスク上のフォルダーに抽出し、commons-collections-3.2.1.jarそのフォルダーをシステム%CLASSPATH%環境変数に追加して、クラスをJavaプログラムにインポートできるようにしました。

このテストプログラムは、私が抱えている問題を示しています。

import org.apache.commons.collections.bag.HashBag;

public class test {
    public static void main(String[] args) {
        HashBag test = new HashBag();
        System.out.println(test.getClass().getName());
        System.out.println(test.uniqueSet().getClass().getName());
    }
}

最初の出力行はorg.apache.commons.collections.bag.HashBag、どちらが予想されるかを示しています。

2番目の出力行はorg.apache.commons.collections.set.UnmodifiableSet、どちらが予期されていないかを示しています。こちらのドキュメントによると、uniqueSet()メソッドはスーパークラスとインターフェイスの両方から継承されますが、どちらの場合も、メソッドはを返すことになっていjava.util.Setます。なぜここで何か違うものを返すのですか?

ありがとう!

4

2 に答える 2

4

全く問題ありません、org.apache.commons.collections.set.UnmodifiableSet実装しjava.util.Setます。

指定されたreturnステートメントを持つ関数は、指定されたクラスの子孫を返すことができます。そうしないと、インターフェイスと抽象クラスを戻り型として使用できません...

それは最高のOOPです:)

于 2012-10-14T20:37:00.560 に答える
2

org.apache.commons.collections.set.UnmodifiableSetjava.util.Setすべてが正常に見えるように実装します。メソッドは、インターフェースの下に隠れている具体的な実装を返す必要があります。

于 2012-10-14T20:37:04.757 に答える