[英]TreeSet in Java
我理解Java最佳实践表明,在声明变量时,通用集合接口用于在左侧声明,而特定实现在右侧。
因此,如果我必须声明Set接口,正确的方法是,
Set<String> set = new TreeSet<>();
但是有了这个声明,我无法访问set.last()
方法。 但是,当我这样宣布时,
TreeSet<String> set = new TreeSet<>();
我可以访问, last()
和first()
。 有人可以帮我理解为什么吗?
last()
和first()
是属于TreeSet
特定方法,而不是通用接口Set
。 当您引用变量时,它会查看源类型而不是分配的类型,因此如果您将TreeSet
存储为Set
,则只能将其视为Set
。 这基本上隐藏了附加功能。
例如,Java中的每个类都扩展了Object
。 因此,这是一个完全有效的分配:
final Object mMyList = new ArrayList<String>();
但是,当直接引用mMyList
而不应用类型转换时,我们将永远无法使用ArrayList
样式功能,因为所有Java都可以告诉它它正在处理通用Object
; 而已。
您可以使用SortedSet接口作为声明(具有first()
和last()
方法)。
Set
的接口不提供last()
和first()
因为它对于Set
并不总是有意义。
Java是一种静态类型语言。 当编译器看到你在做set.last()
,因为它期望set
为Set
。 它不知道set
是否是提供last()
的TreeSet
,或者它是不是的HashSet
。 这就是它抱怨的原因。
坚持,稍等。 您不需要在此处使用具体类TreeSet
声明它。 TreeSet
带有一个SortedSet
接口,它提供了这样的方法。 换句话说:因为你需要使用一个已排序的Set
(为了提供first()
和last()
有意义的),你应该使用的接口应该是SortedSet
而不是Set
因此,你应该做的是
SortedSet<String> set = new TreeSet<>();
要在此处添加现有答案,原因是TreeSet
实现了NavigableSet
接口,该接口继承自java.util.SortedSet
接口的方法比较器, first , last和spliterator。
另一方面, Set
就没有SortedSet
方法,因为它不是从它继承的。
从更多Java TreeSet示例中查看它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.