У меня есть вопрос о полиморфизме в Java - PullRequest
0 голосов
/ 21 апреля 2020

Я определяю карту переменных класса

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, почему это так? Почему полиморфизм проигрывает в этой ситуации?

1 Ответ

1 голос
/ 21 апреля 2020

Вы определяете переменную типа 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();
    }
}
...