TreeSet в Java
Я понимаю, что лучшие практики Java предполагают, что при объявлении переменной интерфейс общего набора используется для объявления слева, а конкретная реализация - справа.
Таким образом, если я должен объявить интерфейсы Set, правильный путь,
Set<String> set = new TreeSet<>();
Однако с этим заявлением я не могу получить доступ к set.last()
метод. Однако, когда я заявляю об этом таким образом,
TreeSet<String> set = new TreeSet<>();
Я могу получить доступ, last()
а также first()
, Может кто-нибудь помочь мне понять почему?
3 ответа
last()
а также first()
конкретные методы, принадлежащие TreeSet
а не общий интерфейс Set
, Когда вы ссылаетесь на переменную, она смотрит на тип источника, а не на выделенный тип, поэтому, если вы сохраняете TreeSet
как Set
, это может рассматриваться только как Set
, Это по существу скрывает дополнительную функциональность.
Как пример, каждый класс в Java расширяется Object
, Поэтому это полностью допустимое распределение:
final Object mMyList = new ArrayList<String>();
Тем не менее, мы никогда не сможем использовать ArrayList
функциональность стиля при обращении непосредственно к mMyList
без применения приведения типов, так как все, что Java может сказать, это то, что он имеет дело с универсальным Object
; ничего более.
Вы можете использовать интерфейс SortedSet как ваше объявление (которое имеет first()
а также last()
методы).
Интерфейс Set
не обеспечивает last()
а также first()
потому что это не всегда имеет смысл для Set
,
Java - это язык статической типизации. Когда компилятор увидит, что ты делаешь set.last()
как и ожидал set
быть Set
, Не будет знать set
это TreeSet
это обеспечивает last()
или это HashSet
это не. Вот почему это жалуется.
Оставайтесь на линии. Вам не нужно объявлять это с помощью конкретного класса TreeSet
Вот. TreeSet
несет SortedSet
интерфейс, который обеспечивает такие методы. Другими словами: потому что вам нужно работать с Set
что отсортировано (для чего имеет смысл предоставить first()
а также last()
) интерфейс, с которым вы должны работать, должен быть SortedSet
вместо Set
Следовательно, то, что вы должны делать, это
SortedSet<String> set = new TreeSet<>();
Чтобы добавить к существующим здесь ответам, причина в том, что TreeSet
реализует интерфейс NavigableSet
который наследуется от интерфейса java.util.SortedSet
методы компаратор, первый, последний и сплитератор.
Только Set
, с другой стороны, не имеет SortedSet
методы, потому что он не наследуется от него.
Проверьте это на других примерах Java TreeSet.