无法解析TreeMap的方法tailMap

时间:2018-10-12 13:37:15

标签: java dictionary interface treemap

为什么TreeMap类型的Map没有定义方法tailMapheadMap

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的具体实现,但确实确实拥有这样的方法。

只需寻找更详细的解释。

谢谢!

1 个答案:

答案 0 :(得分:9)

类型为TreeMap的对象确实具有方法tailMap,但是您通过类型为Map的引用对其进行引用,该引用本身并不公开tailMap方法本身。这就是编译器抱怨的原因。

请注意,Java是静态类型的。这意味着编译器需要确保在编译时,无论实际实现是什么,都可以调用该方法。

由于您可能有一个{strong>未定义 Map方法的tailMap实现,因此编译器不允许您在以下位置调用tailMap方法通过Map引用的对象。

由于NavigableMap接口定义了方法tailMap,因此您可以在通过NavigableMap引用的任何对象上调用该方法。如果您使用TreeMap作为引用类型,这也适用,因为TreeMap实现了NavigableMap。这就是为什么编译器在您的第二个和第三个示例(显式强制转换和NavigableMap参考声明)中不会抱怨的原因。