作者:爱lovely壮壮_366 | 来源:互联网 | 2022-12-02 13:59
为什么TreeMap
类型Map
没有定义方法tailMap
或headMap
.
Map map = new TreeMap<>();
map.tailMap(); //cannot resolve method tailMap
使用显式转换它可以工作:
((TreeMap) map).tailMap("a");
随着NavigableMap
一切都很好:
NavigableMap map1 = new TreeMap<>();
map1.tailMap("a");
如果我是对的,因为界面Map
缺少相应的方法,尽管面对对象map
是类的具体实现TreeMap
,当然确实拥有这样的方法.
只是寻找更详细的解释.
谢谢!
1> 小智..:
类型的对象TreeMap
确实有方法tailMap
,但是您通过类型的引用引用它Map
,它不公开tailMap
方法本身.这就是编译器抱怨的原因.
请注意,Java是静态类型的.这意味着编译器需要在编译时确保有一个方法可以调用,而不管实际的实现.
既然你可以有一个Map
是实现没有定义的tailMap
方法,编译器将不允许调用tailMap
方法通过引用的对象上Map
.
由于NavigableMap
接口定义了方法tailMap
,因此您可以在通过引用的任何对象上调用该方法NavigableMap
.如果你使用这同样适用于TreeMap
为引用类型,因为TreeMap
工具NavigableMap
.这就是为什么编译器不会在你的第二个和第三个例子(显式转换和NavigableMap
引用声明)中抱怨的原因.
实际上,`SortedMap`是定义方法的"最高"接口.所以作为一个经验法则,它应该被使用(就像一个提示 - 问题是关于`NavigableMap`,所以这里指的是好的)