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.
Очень хороший трюк. Вы не получаете исключение, потому что вы не добавили более одного объекта, так как только тогда вам нужно сравнить объект, который в итоге вызовет исключение.