Давайте запустим эту программу с двумя разными вариантами:
public static void main(String[] args) {
List<User> ul = new ArrayList<>();
ul.add(new User());
ul.add(new User());
Set<User> users = new TreeSet<>(ul);
}
сначала с нижним (здесь мы реализуем Comparator)
private static class User implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
return 0;
}
}
С этой программой она выдает Exceptionв потоке "main" java.lang.ClassCastException: test.WTest $ Пользователь не может быть приведен к java.lang.Comparable
, поскольку этот конструктор ожидает, что пользователь реализует java.util.Сопоставимый интерфейс.
Второй запуск, если вы измените реализацию класса User ниже
private static class User implements Comparable<User> {
@Override
public int compareTo(User o) {
return 0;
}
}
Код работает просто отлично!Обратите внимание на разницу в реализациях, теперь мы реализуем интерфейс java.lang.Comparable.
Но класс TreeSet работает с обоими типами, либо с Comparator, либо с Comparable.Таким образом, выбор конструктора зависит только от типа реализации вашего объекта.