java - 为什么变量声明为Map,初始化为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 在左边,HashMap<K, V>( );在右侧?每当创建对象时都需要类型一致性,这不是一条规则吗?除非名称的静态类型是 Map 而动态类型是 HashMap ,大概是 Map 的子类.但是你为什么要这样做呢?方法调用是从对象静态类型(例如 Map s)的角度调用的,但如果动态类型中有重写的方法,则会调用这些方法。这就是类型不同的原因吗?

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

编辑:

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

最佳答案

这叫做 "programming to an interface" - 一种相当普遍且非常有用的做法。

Map<String,Integer>是一个接口(interface)。它不能被实例化。接口(interface)类型的变量需要赋值给实现这些接口(interface)的类的对象。

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

关于java - 为什么变量声明为Map,初始化为HashMap;它们不是不同的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20010333/

相关文章:

java - JAI ImageIO-核心编解码库源码

go - 如何使用反射将结构值转换为结构指针

c - C/Cython 中的动态类型转换

sql - 带两位小数的 CAST 值 - 0.00.0

java - 如何使用elasticsearch java api连接位于不同服务器上的多个节点?

java - 访问SAP云平台上的Java Servlet

haskell - 在 Haskell 中获取数字的除数列表时出现问题

scala - 为什么折叠推断任何?

c++ - 如何在不修改类声明的情况下在创建后正确填充对象?

java - 使用 SwingFXUtils 将 BufferedImage(awt) 转换为 Image(JavaFx)