Java中的树集
我理解Java最佳实践建议,在声明变量时,泛型集合接口用于在左侧声明,而特定实现用于在右侧声明 因此,如果我必须声明集合接口,正确的方法是Java中的树集,java,set,treeset,Java,Set,Treeset,我理解Java最佳实践建议,在声明变量时,泛型集合接口用于在左侧声明,而特定实现用于在右侧声明 因此,如果我必须声明集合接口,正确的方法是 Set<String> set = new TreeSet<>(); 我可以访问,last()和first()。 有人能帮我理解为什么吗?最后一个()和第一个()是属于树集的特定方法,而不是通用接口集。引用变量时,它查看的是源类型而不是分配的类型,因此,如果将树集存储为集,则只能将其视为集。这实际上隐藏了额外的功能 例如,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
方法比较器、first、last和spliterator
另一方面,只有集
没有SortedSet
方法,因为它不是从中继承的
查看更多信息。只有一个问题能回答“最佳+1”
SortedSet<String> set = new TreeSet<>();