Java 为什么变量声明为Map并初始化为HashMap;不是';它们不是不同的类型吗?
假设我想做一个等级的Java 为什么变量声明为Map并初始化为HashMap;不是';它们不是不同的类型吗?,java,types,casting,hashmap,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? Map grades=newhashmap
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?
Map grades=newhashmap();
分数。把(“约翰”,87);//这个工作是因为自动装箱对吗?
分数。放(“卢克”,整数(85));//非自动装箱,这是多余的吗?
为什么Map在左边,而HashMap()在左边代码>在右边?无论何时创建对象,您都需要类型一致性,这难道不是一条规则吗?除非名称的静态类型是Map,而动态类型是HashMap
,它可能是Map
的子类。但你为什么要这么做?方法调用是从对象静态类型(例如Map
s)的角度调用的,但如果动态类型中存在重写的方法,则将调用这些方法。这就是为什么类型不同的原因吗
谢谢!新手问题,但这些东西可能会让人困惑
编辑:
谢谢!因此,一般的格式是:Interface varName=new ImplementedClassConstructor()?我们经常选择超类接口,因为它允许以后更容易的替换(例如,如果我想将HashMap更改为TreeMap?查看。基本上,HashMap是特定类型的映射,这种关系使赋值成为可能。具有超类(或接口)在左侧和右侧使用专用版本是一种良好的做法,因为它可以确保将来对对象的所有调用都只使用超类(或接口)。因此,您可以轻松地替换实现(右侧)在这段代码中,
Map
是一个接口,HashMap
是一个实现该接口的具体类。只能实例化具体类,但可以将一个这样的实例分配给变量(或属性等)声明为接口。事实上,这样做被认为是一种很好的OO编程实践,您应该尽可能尝试这样做。关于自动装箱,您是正确的
使用Map
很好,因为它更通用。假设将来您决定使用不同类型的Map
,即不是HashMap
,然后通过保留Map
,只需将HashMap
更改为不同的Map
实现。被称为-一个相当普遍和非常有用的做法
Map
是一个接口。它不能被实例化。接口类型的变量需要被分配给实现这些接口的类的对象
HashMap
是一个实现Map
的类,因此赋值是有效的。如果您决定以后更改类型,并使用TreeMap
而不是HashMap
,则只需更改新的表达式中的类型。其余代码将保持不变。fr中缺少新的代码整数的ont(85)