我对 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();
}
}
我定义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();
}
}