我是Java和Android的新手。我想了解以下内容:
List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
我的疑问是:它被声明为一个名为listMap的对象,它的类型为List of Map,对吧?但它被实例化为ArrayList。对不起这个简单的问题,但为什么会这样呢?
ps1:我知道List是一个接口,所以我无法实例化接口类型的对象。
ps2:我可以将listMap声明为ArrayList类型。将其声明为List是什么好处。
答案 0 :(得分:2)
ps1:我知道List是和接口,所以我不能实例化它的类型和对象。
List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
您是对的,List
是接口,因此您将无法实例化接口。您需要使用接口的某个实现类来实例化。 ArrayList
是接口List
的实现类,在able语句中使用。
ps2:我可以将listMap声明为ArrayList类型。将其声明为List是什么好处。
你总是可以在左侧使用ArrayList
,即
ArrayList<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
使用界面的优势:如果要跨类使用变量对象(listMap),那么最好使用 Interface 作为类型,但是如果你的变量对象(lsitMap)在你的程序本地本地,然后我不认为有任何额外的好处。
现在您将考虑Map
,它又是接口。请注意,您没有通过上述语句实例化Map
对象。您只是提到您的listMap
列表将包含Map
类型的元素。
再次,当您尝试在listMap
中实例化要添加的元素时,您需要一个Map
接口的实现类,例如HashMap
,如下所示:
List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
Map<String, String> lsitMapElement1 = new HashMap<String, String>();
lsitMapElement1.put("key1", "value1");
listMap.add(lsitMapElement1 );
Map<String, String> lsitMapElement2 = new HashMap<String, String>();
lsitMapElement2.put("key2", "value2");
listMap.add(lsitMapElement2);
希望这能使事情变得清晰。
答案 1 :(得分:2)
ArrayList
是List
的子类型。这是一个ArrayList
是一个List
。
您可以将子类型的实例分配给它的超类型的变量。或者,如果预期某些超类型,则可以用某种子类型替换它。
使用它实现对象多态(带继承),并且您的代码不依赖于某些特定的实现。如果您突然意识到ArrayList
无法正常工作而您需要List
的其他实现,那么您可以轻松切换到该实现,而不会影响其余代码。
这就是他们说的原因,&#34;尽可能对代码进行编码。&#34;
答案 2 :(得分:1)
ArrayList
类实现List
接口,这意味着List
定义的所有方法都已实现。其他代码并不需要知道这是ArrayList
,只是它实现了所有List
方法。