Почему JavaS TreeSet не указывает, что его параметр типа должен расширять Comparable? - PullRequest
9 голосов
/ 13 апреля 2010

например, Приведенный ниже код вызывает исключение ClassCastException при добавлении второго объекта в TreeSet. Не мог ли TreeSet быть написан так, чтобы параметр типа мог быть только сопоставимым типом? Т.е. TreeSet не будет компилироваться, потому что Object не Comparable. Таким образом, дженерики действительно делают свою работу - быть безопасными.

import java.util.TreeSet;
public class TreeSetTest {
  public static void main(String [] args) {
   TreeSet<Object> t = new TreeSet<Object>();
   t.add(new Object());
   t.add(new Object());
  }
}

Ответы [ 4 ]

13 голосов
/ 13 апреля 2010

TreeSet не требует, чтобы его параметр типа был Comparable, поскольку для сравнения не Comparable значений может потребоваться внешний Comparator.

5 голосов
/ 13 апреля 2010

Если тип должен быть Comparable, вы не можете создать TreeSet с несопоставимым типом и Comparator (что вы можете сделать, как сейчас).

Один из способов исправить это, сохраняя при этом типобезопасность, состоял бы в том, чтобы иметь два класса: один с сопоставимым параметром типа и один с несопоставимым параметром типа и без конструктора по умолчанию (только конструктор, который принимает Comparator) , но я предполагаю, что разработчики java не хотели вводить два класса, которые в основном делали одно и то же (хотя один из них можно легко реализовать как обертку вокруг другого).

Другим (и, возможно, более чистым способом) было бы расширение системы типов так, чтобы определенные конструкторы существовали только при использовании с определенными параметрами типа (т.е. конструктор по умолчанию существует, только если параметр типа сопоставим), но я предполагаю, что сделал общую систему слишком сложной для Java.

1 голос
/ 13 апреля 2010

Это потому, что значение не обязательно должно реализовывать Comparable. Вы можете явно передать объект set Comparator, в этом случае тип элемента не обязательно должен быть Comparable.

0 голосов
/ 13 апреля 2010

Вы также можете создать TreeSet с Comparator в качестве параметра конструктора. Тогда ваши предметы не должны быть сопоставимы.

...