为什么TreeMap
类型的Map
没有定义方法tailMap
或headMap
。
Map<String, String> map = new TreeMap<>();
map.tailMap(); //cannot resolve method tailMap
通过显式强制转换可以起作用:
((TreeMap<String, String>) map).tailMap("a");
有了NavigableMap
,一切都很好:
NavigableMap<String, String> map1 = new TreeMap<>();
map1.tailMap("a");
如果我是对的,是因为接口Map
缺少相应的方法,尽管面对的对象map
是类TreeMap
的具体实现,但确实确实拥有这样的方法。
只需寻找更详细的解释。
谢谢!
答案 0 :(得分:9)
类型为TreeMap
的对象确实具有方法tailMap
,但是您通过类型为Map
的引用对其进行引用,该引用本身并不公开tailMap
方法本身。这就是编译器抱怨的原因。
请注意,Java是静态类型的。这意味着编译器需要确保在编译时,无论实际实现是什么,都可以调用该方法。
由于您可能有一个{strong>未定义 Map
方法的tailMap
实现,因此编译器不允许您在以下位置调用tailMap
方法通过Map
引用的对象。
由于NavigableMap
接口定义了方法tailMap
,因此您可以在通过NavigableMap
引用的任何对象上调用该方法。如果您使用TreeMap
作为引用类型,这也适用,因为TreeMap
实现了NavigableMap
。这就是为什么编译器在您的第二个和第三个示例(显式强制转换和NavigableMap
参考声明)中不会抱怨的原因。