Ответ 1
TreeSet
реализуется таким образом, потому что вы можете альтернативно предоставить Comparator
, и в этом случае элементы не должны быть Comparable
. Единственный способ поддерживать оба поведения без разделения реализации на несколько классов состоял в том, чтобы включать проверки времени выполнения - это было просто дизайнерское решение автора (ов) этого класса.
TreeSet
фабричных методов TreeSet
вместо публичных конструкторов было бы способом поддерживать проверку времени компиляции с использованием более строгих ограничений типа общего типа, но это было бы отрыв от соглашения API коллективных коллекций об экспонировании открытых конструкторов no-arg и copy для его классы реализации. Как вы отметили в своем комментарии, Гува отправляется на заводский маршрут со своими коллекциями, и имхо лучше для него.