这些 TreeSet 声明之间的区别

Difference between these declaration of TreeSet

所以我必须在我的代码中使用 TreeSet

作为TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable

interface NavigableSet<E> extends SortedSet<E> which extends Set<E>

我可以使用这三个声明中的任何一个:

NavigableSet<String> myTreeSet= new TreeSet<>();
SortedSet<String> myTreeSet= new TreeSet<>();
Set<String> myTreeSet= new TreeSet<>();

我知道我将只能访问那些由我在声明中使用的接口公开的方法。是否有任何其他理由需要考虑为 TreeSet 选择特定的声明?

正如您所说,这基本上是您允许他人(或您自己)使用的内容。您喜欢与 TreeSet 一起使用的其他方法可能取决于实际声明。所以可能有一个方法需要一个 SortedSet,但是当你将你的 TreeSet 定义为 Set 时,它将无法继续

您应该使用您喜欢的界面进行编程。 但不同之处在于您正在为哪个接口编程。我的意思是,编程到接口(声明类型)而不是实际的 TreeSet 集合。

这是解释 Programming to an interface 的最佳答案。

请不要做出初步决定。如果您不需要 NavigableSet 中的方法,请不要使用它。只需使用 Set<String>.

作为指导原则,请始终尽可能选择最顶级的类型,因为这样可以更好地从客户端代码中解耦到具体实现。大多数时候,调用代码知道使用了哪个实现并不重要,您只想提供行为而不是公开它。也就是说,有时您会觉得需要更多的控制,那么您应该遍历接口层次结构,直到找到必要的控制级别,但这应该是例外情况,而不是规则