我对使用Interface for Java类的建议感到有点困惑,比如在这个帖子中:Why should the interface for a Java class be preferred?
我理解你为什么要使用这个界面:如果以后发生了变化,你需要更少的代码来清理。
但是,是否存在使用界面会阻止您首先考虑选择该特定类的性能原因的情况?
例如,如果我有一个TreeMap,我假设我应该能够找到最多O(logn)中的任何元素。这就是为什么它有很好的方法,我可以利用像highEntry(),lowerEntry(),lastEntry()。
如果我将此TreeMap引用为Map,现在我相信我被迫通过O(n)中的列表一次迭代一个元素以找到该条目。
我是Java的新手,所以如果我在这里遗漏了一些内容,请告诉我。
答案 0 :(得分:2)
如果我将此TreeMap引用为地图,现在我相信我 被迫通过O(n)中的列表一次迭代一个元素 找到那个条目。
不,你不是被迫这样做的。如果您确定Map
引用中包含对TreeMap
的引用,并且您想要访问TreeMap
的特定方法,那么您始终可以将Map
引用强制转换为TreeMap
higherEntry()
引用,然后访问相应的方法,例如lowerEntry()
,Map
。
但是,唯一需要注意的是,您必须确保TreeMap
引用实际指向ClassCastException
,以避免在运行时获得super class
。
事实暗示,sub classes
及其super class
本质上是协变。因此,您可以在它们之间执行强制转换,前提是您没有在运行时违反规则(即sub class
引用持有对其他sub class
实例的引用,该实例与{{不一致“ 1}}你正在施展。)
现在为您的示例,因为TreeMap
还实现了NavigableMap
接口,这是Map
接口的子接口,因此您可以使用它而不是Map
接口。因此,您可以拥有多态性的优势,而无需进行类型转换。
答案 1 :(得分:2)
如果您想使用higherEntry
,lowerEntry
和lastEntry
等方法,那么只需使用NavigableMap
界面而不是Map
界面或TreeMap
上课。
通常,尽可能经常使用接口,并使用支持您想要使用的所有操作的最通用接口。