0

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

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

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

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

ps2:我可以将 listMap 声明为 ArrayList 类型。将其声明为列表有什么好处。

4

3 回答 3

2

ps1:我知道 List 是和接口,所以我不能实例化它的类型和对象。

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

你是对的,List是一个接口,因此你将无法实例化一个接口。您需要使用接口的一些实现类来实例化。ArrayList是接口的实现类,List在able语句中使用。

ps2:我可以将listMap 声明为ArrayList 类型。将其声明为列表有什么好处。

您总是可以ArrayList在左侧使用,即

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

使用接口的优势: 如果你想在类中使用你的变量对象(listMap),那么最好使用接口作为类型,但是如果你的变量对象(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);

希望这能让事情变得清楚。

于 2012-11-05T03:46:48.273 回答
2

ArrayList是 的子类型List。那是一个ArrayListis-a List

您可以将子类型的实例分配给它的超类型的变量。或者,如果需要超类型 some ,您可以将其替换为 some substype 。


您可以通过它实现对象多态性(通过继承),并且您的代码不依赖于某些特定的实现。而是在未来的任何时候,如果您突然意识到这ArrayList不起作用并且您需要其他一些实现,List那么您可以轻松切换到该实现而不影响其余代码。

这就是他们说“尽可能始终针对接口编写代码”的原因。

于 2012-11-05T03:49:59.723 回答
1

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

于 2012-11-05T03:48:33.977 回答