Java: можно добавить 1 не сопоставимый объект в TreeSet?

Вот мой код:

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,

Я пытался добавить еще Dog на TreeSet и бросил ClassCastException как и ожидалось.

РЕДАКТИРОВАТЬ: я использую Java 6

3 ответа

Решение

В Java 7 было добавлено изменение, чтобы исправить это. Это была ошибка.

Из-за ошибки в java.util.TreeMap, ранее можно было вставить недопустимые нулевые элементы и элементы, не реализующие Comparable в пустую TreeMap с и TreeSet с. Только один недопустимый элемент может быть вставлен в пустой TreeMap с или TreeSet s; дополнительные элементы вызовут ожидаемый NullPointerException или же ClassCastException, Большинство других операций по сбору также потерпят неудачу. Начиная с JDK 7, вставка недопустимого нулевого элемента или элемента, не реализующего Comparable в пустую TreeMap или же TreeSet бросает NullPointerException,

(TreeSet реализуется с TreeMap в качестве базовой структуры данных.)

Согласно javadoc, который является ожидаемым поведением, он вызовет исключение ClassCastException, только если новый элемент не может быть сравнен с текущими элементами в наборе:

ClassCastException - если указанный объект не может быть сравнен с элементами в настоящее время в этом наборе

РЕДАКТИРОВАТЬ

Однако это справедливо для JSE6, очевидно, что Javadoc для TreeSet в JSE7 устарел, поскольку, как указывает @SotiriosDelimanolis, эта проблема была решена для JSE7.

Очень хороший трюк. Вы не получаете исключение, потому что вы не добавили более одного объекта, так как только тогда вам нужно сравнить объект, который в итоге вызовет исключение.

Другие вопросы по тегам