为什么变量声明为Map并初始化为HashMap;它们不是不同类型吗?

bam*_*222 5 java types casting hashmap

假设我想取得HashMap成绩。

 Map<String,Integer> grades = new HashMap<String,Integer>(); 
 grades.put("John", 87); // this work due to auto-boxing right?
 grades.put("Luke", Integer(85)); // non-autoboxed, is this redundant? 
Run Code Online (Sandbox Code Playgroud)

为什么地图分在左边和HashMap<K, V>( );右边?每当创建对象时都需要类型一致性,这不是一条规则吗?除非名称的静态类型是 Map 并且动态类型是HashMap,它可能是 的子类Map。但你为什么要这样做呢?方法调用是从对象静态类型(例如 s)的角度调用的Map,但如果动态类型中有重写的方法,则会调用这些方法。这就是类型不同的原因吗?

谢谢!新手问题,但这东西可能会令人困惑......

编辑:

谢谢!所以一般格式为:Interface varName = new ImplementedClassConstructor(); ?我们经常选择超类接口,因为它允许以后更容易替换(例如,如果我想将 HashMap 更改为 TreeMap?

das*_*ght 4

这称为“接口编程” ——一种相当常见且非常有用的实践。

Map<String,Integer>是一个接口。它无法被实例化。接口类型的变量需要分配给实现这些接口的类的对象。

HashMap<String,Integer>是一个实现 的类Map<String,Integer>,因此分配是有效的。如果您决定稍后更改类型并使用TreeMap<String,Integer>代替HashMap<String,Integer>,您所需要做的就是更改new表达式中的类型。其余代码将保持不变。