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