无法解析 TreeMap 的方法 tailMap

Cannot resolve method tailMap for TreeMap

为什么类型 MapTreeMap 没有定义方法 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 是 class [=13= 的具体实现] 确实有这样的方法。

只是在寻找更详细的解释。

谢谢!

TreeMap 类型的对象确实有方法 tailMap,但您是通过 Map 类型的引用来引用它的,它不会公开 tailMap方法本身。这就是编译器抱怨的原因。

请注意 Java 是 静态类型 。这意味着编译器需要确保在编译时有一个方法可以调用,而不管实际实现如何。

由于您可能有一个 Map 实现 没有定义 tailMap 方法,编译器将不允许您调用 [=通过 Map.

引用的对象上的 11=] 方法

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