Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么变量声明为Map并初始化为HashMap;不是';它们不是不同的类型吗?_Java_Types_Casting_Hashmap - Fatal编程技术网

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)