2016-03-23 3 views
2

Я понимаю, что наилучшая практика Java предполагает, что, объявляя переменную, общий интерфейс набора используется для объявления слева и конкретной реализации справа.TreeSet в Java

Таким образом, если я должен объявить Set интерфейсов, правильный путь,

Set<String> set = new TreeSet<>(); 

Однако с этой декларацией я не в состоянии получить доступ к методу set.last(). Однако, когда я объявляю это так,

TreeSet<String> set = new TreeSet<>(); 

я могу получить доступ, last() и first(). Может кто-нибудь помочь мне понять почему?

ответ

4

last() и first() - это конкретные методы, относящиеся к TreeSet, а не общий интерфейс Set. Когда вы ссылаетесь на переменную, она смотрит на тип источника, а не на выделенный тип, поэтому, если вы сохраняете TreeSet как Set, его можно рассматривать только как Set. Это по существу скрывает дополнительную функциональность.

В качестве примера, каждый класс в Java расширяет Object. Поэтому это совершенно действует распределение:

final Object mMyList = new ArrayList<String>();

Однако, мы никогда не сможем использовать ArrayList функциональность стиля, когда речь идет непосредственно mMyList без применения типа литья, так как все Java может сказать, что он имеет дело с общим Object; больше ничего.

+0

Только тот, который отвечает на вопрос, лучший +1 –

1

Интерфейс Set не содержит last() и first(), поскольку он не всегда имеет смысл для Set.

Java - это статический язык ввода. Когда компилятор видит, что вы делаете set.last(), как ожидается, set будет Set. Он не будет знать, является ли setTreeSet, который предоставляет last(), или это HashSet, что нет. Вот почему он жалуется.

Держать. Вам не нужно объявлять его, используя конкретный класс TreeSet здесь. TreeSet имеет интерфейс SortedSet, который предоставляет такие методы. В другом слове: потому что вы должны работать с Set, который отсортирован (для которых это имеет смысл, чтобы обеспечить first() и last()), интерфейс, который вы должны работать против должно быть SortedSet вместо Set

Поэтому то, что вы должны быть делает это

SortedSet<String> set = new TreeSet<>(); 
2

Вы можете использовать интерфейс SortedSet в качестве декларации (которая имеет first() и last() методы).