Почему TreeSet Java не указывает, что его параметр типа должен расшириться Сопоставимый?

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

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());
  }
}
9
задан Carl Manaster 13 April 2010 в 19:08
поделиться

4 ответа

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

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

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

5
ответ дан 4 December 2019 в 11:04
поделиться

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

13
ответ дан 4 December 2019 в 11:04
поделиться

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

1
ответ дан 4 December 2019 в 11:04
поделиться

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

0
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: