我对 Java 中的多态性有疑问

I have question about the Polymorphism in Java

我定义class变量映射

private Map<Double, Integer> map = new TreeMap<>((o1, o2)->-o1.compareTo(o2));

但是当我无法在class方法中调用它的方法时

private void inOrder(BalancedBinaryTree.TreeNode root, double target, int k){
    ...
    map.pollFirstEntry();
    ...
}

但是当我把它修复成

private TreeMap<Double, Integer> map = new TreeMap<>((o1, o2)->-o1.compareTo(o2));

现在可以调用TreeMap的方法了,为什么?为什么多态性会在这种情况下失败?

您正在定义 Map using the TreeMap 实现类型的变量。在这种情况下,您将能够仅调用 Map 中定义的方法。在第二种情况下,您正在定义一个 TreeMap 变量,以便您可以调用您提到的所有额外方法。

如果在第一种情况下您将强制转换为 TreeMap,您也可以调用该方法。

像这样:

import java.util.Map;
import java.util.TreeMap;

public class TreeMapCheck {
        static Map<Integer, Double> map = new TreeMap<>();
        static TreeMap<Integer,Double> treeMap = new TreeMap<>();

    public static void main(String[] args) {
        ((TreeMap)map).pollFirstEntry();
    }
}

如果实现与您预期的不同,这种方法将失败,因此可以保护 herself/himself 免于检查给定实例是否为 TreeMap,如下所示:

public static void main(String[] args) {
    ((TreeMap)map).pollFirstEntry();

    if (map instanceof TreeMap) {
        ((TreeMap)map).pollFirstEntry();
    }
}