繁体   English   中英

Java中的TreeSet

[英]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() ,因为它期望setSet 它不知道set是否是提供last()TreeSet ,或者它是不是的HashSet 这就是它抱怨的原因。

坚持,稍等。 您不需要在此处使用具体类TreeSet声明它。 TreeSet带有一个SortedSet接口,它提供了这样的方法。 换句话说:因为你需要使用一个已排序的Set (为了提供first()last()有意义的),你应该使用的接口应该是SortedSet而不是Set

因此,你应该做的是

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

要在此处添加现有答案,原因是TreeSet实现了NavigableSet接口,该接口继承自java.util.SortedSet接口的方法比较器, firstlast和spliterator。

另一方面, Set就没有SortedSet方法,因为它不是从它继承的。

在此输入图像描述

从更多Java TreeSet示例中查看它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM