Java中的树集

Java中的树集,java,set,treeset,Java,Set,Treeset,我理解Java最佳实践建议,在声明变量时,泛型集合接口用于在左侧声明,而特定实现用于在右侧声明 因此,如果我必须声明集合接口,正确的方法是 Set<String> set = new TreeSet<>(); 我可以访问,last()和first()。 有人能帮我理解为什么吗?最后一个()和第一个()是属于树集的特定方法,而不是通用接口集。引用变量时,它查看的是源类型而不是分配的类型,因此,如果将树集存储为集,则只能将其视为集。这实际上隐藏了额外的功能 例如,Java中

我理解Java最佳实践建议,在声明变量时,泛型集合接口用于在左侧声明,而特定实现用于在右侧声明

因此,如果我必须声明集合接口,正确的方法是

Set<String> set = new TreeSet<>();
我可以访问,
last()
first()
。 有人能帮我理解为什么吗?

最后一个()和第一个()是属于树集的特定方法,而不是通用接口集。引用变量时,它查看的是源类型而不是分配的类型,因此,如果将
树集
存储为
,则只能将其视为
。这实际上隐藏了额外的功能

例如,Java中的每个类都扩展了
对象
。因此,这是一个完全有效的分配:

final Object mMyList=new ArrayList()


但是,当直接引用
mMyList
时,如果不应用类型转换,我们将永远无法使用
ArrayList
样式功能,因为Java只能告诉我们它处理的是一个泛型
对象
;仅此而已。

集合
的界面不提供
最后一个()
第一个()
,因为它对于集合来说并不总是有意义的

Java是一种静态类型语言。当编译器看到您正在执行
set.last()
,因为它希望
set
成为
set
。它不知道
set
是提供
last()
TreeSet
,还是不提供的
HashSet
。这就是它抱怨的原因

等一下。您不需要在此处使用具体类
TreeSet
来声明它
TreeSet
带有一个
SortedSet
接口,该接口提供此类方法。换句话说:因为您需要使用排序的
(为此提供
first()
last()
),所以您应该使用的接口应该是
SortedSet
,而不是

因此,你应该做的是

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

您可以使用SortedSet接口作为声明(它具有
first()
last()
方法)。

要添加到现有答案中,原因是
TreeSet
实现了接口
NavigableSet
,该接口继承了接口
java.util.SortedSet
方法比较器、firstlast和spliterator

另一方面,只有
没有
SortedSet
方法,因为它不是从中继承的


查看更多信息。

只有一个问题能回答“最佳+1”
SortedSet<String> set = new TreeSet<>();