如何在泛型类型中定义泛型类型?

时间:2011-12-05 23:30:28

标签: java generics abstraction

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

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

如果我正确地解释了您的问题,那么您有一个将对象映射到一起的集合,并想知道是否有一种方法可以做得更好。

最好是我们为每个元素定义一个目的,例如:

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.

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

答案 2 :(得分:0)

你可以创建一个抽象的工厂类。通常这些都适合以通用方式为具体类型创建抽象包装器。工厂通常也被实施为单身人士。

答案 3 :(得分:0)

如果不了解您的具体情况,可以推荐的最佳方法是抽象出存储方法。

例如:

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);
}