在Java中使用Generic Maps的问题

时间:2012-10-07 20:47:59

标签: java generics maps

我有一个我试图用来测试HashMap和TreeMap的类,如下所示;

public class TestMap<KeyType, ValueType>
{
private Map<KeyType, ValueType> internalMap;

/*
 * Entry point for the application
 */
public static void main( String [ ] args )
{
    TestMap<String, Integer> testHashMap = new TestMap<String,Integer>(new HashMap<String, Integer>());
    testHashMap.test();

    TestMap<String, Integer> testTreeMap = new TestMap<String,Integer>(new TreeMap<String, Integer>());
    testTreeMap.test();
}    

/*
 * Constructor which accepts a generic Map for testing
 */
public TestMap(Map<KeyType, ValueType> m)
{
    this.internalMap = m;
}   

public void test()
{
    try
    {
        //put some values into the Map
        this.internalMap.put("Pittsburgh Steelers", 6);

        this.printMap("Tested Map", this.internalMap);  
    }
    catch (Exception ex)
    {

    }
}

}

在尝试调用put()方法时,我收到以下错误消息;

  

类型Map中的put(KeyType,ValueType)方法不适用于参数(String,int)

我没有收到任何其他警告,我不明白我为什么会这样做?这不是泛型的全部意义吗?一般地定义并具体实施?

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

test()方法是TestMap类的一部分。在任何TestMap方法中,您只能引用泛型类型,而不是任何特定类型(因为这取决于单个实例)。但是,您可以这样做:

public static void main( String [ ] args )
{
    TestMap<String, Integer> testHashMap = new TestMap<String,Integer>(new HashMap<String, Integer>());
    testHashMap.internalMap.put("Pittsburgh Steelers", 6);

    TestMap<String, Integer> testTreeMap = new TestMap<String,Integer>(new TreeMap<String, Integer>());
    testTreeMap.internalMap.put("Pittsburgh Steelers", 6);
}

答案 1 :(得分:3)

问题是你的整体类是通用的,但是你试图用一组特定的类型来测试它。尝试将测试方法移出对象并在TestMap<String, int>上使用它。

答案 2 :(得分:1)

另一个选项是从TestMap对象中删除泛型。他们目前似乎没有做任何事情。

public class TestMap {
    private Map<String, Integer> internalMap;

    /*
     * Entry point for the application
     */
    public static void main( String [ ] args )
    {
        TestMap testHashMap = new TestMap(new HashMap<String, Integer>());
        testHashMap.test();

        TestMap testTreeMap = new TestMap(new TreeMap<String, Integer>());
        testTreeMap.test();
    }

    /*
     * Constructor which accepts a generic Map for testing
     */
    public TestMap(Map<String, Integer> m)
    {
        this.internalMap = m;
    }   

    public void test()
    {
        try
        {
            //put some values into the Map
            this.internalMap.put("Pittsburgh Steelers", 6);

            this.printMap("Tested Map", this.internalMap);  
        }
        catch (Exception ex)
        {

        }
    }
}