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.

Другие вопросы по тегам