【问题标题】:How do I abstract over defining a generic type within a generic type?如何在泛型类型中抽象定义泛型类型?
【发布时间】:2011-12-05 23:30:28
【问题描述】:

假设我有一个 HashMap 的 HashMap 定义如下:

hashMap = new HashMap<String, HashMap<String, Integer>>();

我将如何对此进行抽象以使定义更清晰?

【问题讨论】:

  • 你能解释一下对此有什么不明白的地方吗?
  • 您能否详细说明您要完成的工作?
  • 你想让什么更清楚?

标签: java generics abstraction


【解决方案1】:

如果我正确解释了您的问题,那么您有一个将对象映射在一起的集合,并且想知道是否有更好的方法来做到这一点。

最好为每个元素定义一个用途,例如:

Map<String,        // ZIP code   (e.g. 6009)
    Map<String,    // Name       (e.g. John Smith)
        Integer>>  // Age        (e.g. 42)

在这种情况下,您可以创建以下类:

class Person {
  private String name;
  private Integer age;

  // Constructor and getters etc.
}

这将您的收藏简化为:

Map<String,         // ZIP/Postal code
    List<Person>>   // List of people in this postal code.

然后,您可以根据需要进一步简化它,但这会让您了解要采取的步骤。最重要的是使用有意义的名称。

【讨论】:

  • 好主意,但Map&lt;ZIP,Map&lt;Name,Age&gt;&gt; 会不会更好?
  • @emory 这绝对容易理解,但引入了只需要名称的类型。使用描述性对象Person 来模拟实体之间的映射是我试图展示的要点。地图的地图(可以说)在概念上更加困难。
【解决方案2】:

如果你不想再重复定义,你可以把它变成一个类,定义不是不清楚,只是罗嗦..

class HashBrowns : HashMap<String, HashMap<String, Integer>>

【讨论】:

    【解决方案3】:

    你可以创建一个抽象工厂类。通常,这些对于以通用方式为具体类型创建抽象包装器很有用。工厂通常也被实现为单例。

    【讨论】:

      【解决方案4】:

      在不了解您的具体情况的情况下,可以推荐的最好的方法是抽象出存储方法的一些方法。

      例如:

      public Integer getNumber(String name, String attribute)
      {
          HashMap<String,Integer> subMap = hashMap.get(name);
          if (subMap != null)
          {
              return subMap.get(attribute);
          } else
          {
              return null;
          }
      }
      
      public void setNumber(String name, String attribute, Integer number)
      {
          HashMap<String,Integer> subMap = hashMap.get(name);
          if (subMap == null)
          {
              subMap = new HashMap<String,Integer>();
              hashMap.put(name,subMap);
          }
      
          subMap.put(attribute,number);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 2018-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多