Если бы конструктор TreeSet()
не был общедоступным, вы могли бы проверить это во время компиляции с помощью заводского метода, например, так:
public static <E extends Comparable<? super E>> TreeSet<E> create() {
return new TreeSet<>();
}
Вы можете вызвать это только с параметром типа, который естественным образомсравнимо:
TreeSet<String> a = TreeSet.create(); // ok
TreeSet<Object> b = TreeSet.create(); // error
Но конструктор публичный;и в Java нет языкового механизма, который позволял бы вам ограничивать параметры типа, используемые для вызова конструктора.
Этот конструктор должен быть общедоступным, поскольку он существовал до обобщения, и поэтому его удаление нарушило бы обратную совместимость.