为什么Map
类型的TreeMap
不定义方法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
的具体实现,当然确实拥有这些方法。
只是在寻找更详细的解释。
谢谢!
> 类型TreeMap
的对象确实有方法tailMap
,但你通过类型Map
的引用引用它,这不会公开tailMap
方法本身。这就是编译器抱怨的原因。
请注意,Java 是静态类型的。这意味着编译器需要在编译时确保有一个方法可以调用,而不管实际实现如何。
由于您可能有一个未定义tailMap
方法的Map
实现,因此编译器将不允许您在通过Map
引用的对象上调用tailMap
方法。
由于NavigableMap
接口定义了方法tailMap
,因此您可以在通过NavigableMap
引用的任何对象上调用该方法。如果使用TreeMap
作为引用类型,这也适用,因为TreeMap
实现NavigableMap
。这就是为什么编译器不会在第二个和第三个示例(显式强制转换和NavigableMap
引用声明(中抱怨的原因。