我定义类变量映射

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


但是当我不能在类方法中调用它的方法时

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实现定义类型为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();
    }
}


如果实现的方式与您期望的方式不同,则这种方法将失败,因此可以防止自己检查给定实例是否为TreeMap,如下所示:

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

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

关于java - 我对Java中的多态性有疑问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61337234/

10-11 20:14