【问题标题】:I have question about the Polymorphism in Java我对 Java 中的多态性有疑问
【发布时间】:2020-04-21 06:27:55
【问题描述】:

我定义类变量映射

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的方法了,这是为什么呢?为什么多态在这种情况下会丢失?

【问题讨论】:

  • 你误解了多态性。它不允许您访问其父类型变量的特定子类型的方法;但是,除了允许父类型变量采用各种具体的子类对象外,这还意味着方法的行为(已经声明并可能在父类型或变量类型中实现)在运行时可能会根据用于创建的具体实现子类而变化对象。
  • 谢谢,我想我明白我为什么错了

标签: java dictionary polymorphism treemap


【解决方案1】:

您正在使用TreeMap 实现定义Map 类型的变量。在这种情况下,您将能够仅调用 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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2020-12-21
    • 2022-01-26
    • 2021-03-04
    • 2020-12-30
    • 2017-02-22
    • 2019-05-06
    相关资源
    最近更新 更多