2

これが私のコードです:

public static void main(String[] args){
    TreeSet<Dog> d = new TreeSet<Dog>();
    d.add(new Dog());
    System.out.println(d.size());
}

class Dog{
}

ご覧のとおり、DogクラスはComparableオブジェクトではなく、Comparator並べ替えに使用する を指定していません。このコード スニペットはどのように例外なく実行されるのでしょうか? プリントアウトしました1

DogTreeSet に別のものを追加しようとしましたがClassCastException、期待どおりにスローされました。

編集:Java 6を使用しています

4

3 に答える 3

6

これを修正するためにJava 7に追加された変更がありました。エラーでした。

のエラーにより、java.util.TreeMap以前は無効な null 要素と実装Comparable されていない要素を空TreeMapの およびに挿入することTreeSetできました。TreeMap空の s またはTreeSetsに挿入できる無効な要素は 1 つだけです。追加の要素は、予想されるNullPointerExceptionorを引き起こしClassCastExceptionます。コレクションに対する他のほとんどの操作も失敗します。JDK 7 の時点で、無効な null 要素または実装 Comparableされていない要素を空のTreeMapまたはTreeSetスローに挿入すると、 NullPointerException.

(は、その基礎となるデータ構造としてTreeSeta で実装されます。)TreeMap

于 2014-03-05T16:37:42.843 に答える
2

予想される動作であるjavadocによると、新しい要素がセット内の現在の要素と比較できない場合にのみ ClassCastException がスローされます。

ClassCastException - 指定されたオブジェクトを現在このセットにある要素と比較できない場合

編集

@SotiriosDelimanolisが指摘しているように、この問題はJSE7で解決されたため、JSE7のTreeSetのjavadocは古くなっているようです。

于 2014-03-05T16:34:00.767 に答える
0

とてもいいトリックです。複数のオブジェクトを追加しなかったため、例外が発生していません。例外をスローするオブジェクトを比較する必要があるだけです。

于 2014-03-05T16:40:16.460 に答える