为什么我可以声明一个接口类型的对象,并将该对象实例化为另一种类型?

时间:2012-11-05 03:45:21

标签: java android list arraylist

我是Java和Android的新手。我想了解以下内容:

List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();

我的疑问是:它被声明为一个名为listMap的对象,它的类型为List of Map,对吧?但它被实例化为ArrayList。对不起这个简单的问题,但为什么会这样呢?

ps1:我知道List是一个接口,所以我无法实例化接口类型的对象。

ps2:我可以将listMap声明为ArrayList类型。将其声明为List是什么好处。

3 个答案:

答案 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)

ArrayListList的子类型。这是一个ArrayList是一个List

您可以将子类型的实例分配给它的超类型的变量。或者,如果预期某些超类型,则可以用某种子类型替换它。


使用它实现对象多态(带继承),并且您的代码不依赖于某些特定的实现。如果您突然意识到ArrayList无法正常工作而您需要List的其他实现,那么您可以轻松切换到该实现,而不会影响其余代码。

这就是他们说的原因,&#34;尽可能对代码进行编码。&#34;

答案 2 :(得分:1)

ArrayList类实现List接口,这意味着List定义的所有方法都已实现。其他代码并不需要知道这是ArrayList,只是它实现了所有List方法。