2

我对使用 Java 类的接口的建议有点困惑,就像在这个线程中一样:为什么应该首选 Java 类的接口?

我理解您为什么要使用该界面:如果稍后发生更改,您需要清理的代码就会减少。

但是,在某些情况下,使用接口会阻止您利用性能原因,您首先选择该特定类吗?

例如,如果我有一个 TreeMap,我假设我应该能够在最多 O(logn) 中找到任何元素。这就是为什么它有我可以利用的好方法,比如higherEntry()、lowerEntry()、lastEntry()。

如果我改为将此 TreeMap 引用为 Map,现在我相信我不得不通过 O(n) 中的列表一次迭代一个元素来定位该条目。

我是 Java 新手,所以如果我在这里遗漏了什么,请告诉我。

4

2 回答 2

2

如果我改为将此 TreeMap 引用为 Map,现在我相信我不得不通过 O(n) 中的列表一次迭代一个元素来定位该条目。

不,你不是被迫这样做的。如果您确定您的Map引用包含对 的引用TreeMap,并且您想要访问 的特定方法TreeMap,那么您始终可以将引用类型转换为Map引用TreeMap,然后访问适当的方法,例如higherEntry(), lowerEntry()。但是,唯一需要注意的是,您必须确保您的Map引用实际上指向 a TreeMap,以避免ClassCastException在运行时获得 a 。

这是由一个事实暗示的,asuper class和它本质上sub classes协变的。因此,您可以在它们之间执行强制转换,前提是您在运行时没有违反规则(即super class引用持有对其他sub class实例的引用,这与sub class您要转换的对象不协变)。

现在以您的示例为例,由于TreeMap还实现了NavigableMap接口,它是接口的子接口Map,因此您可以使用它来代替Map接口。因此,您可以拥有多态性的优势,而无需进行类型转换。

于 2013-02-08T19:43:21.433 回答
2

如果您想使用 、 和 等方法higherEntrylowerEntrylastEntry只需使用NavigableMap接口而不是Map接口或TreeMap类。

一般来说,尽可能频繁地使用接口,并尽可能使用最通用的接口来支持您想要使用的所有操作。

于 2013-02-08T19:44:03.770 回答