为什么整数keySet成员声明为对象?

时间:2016-06-02 20:58:27

标签: java

我正在尝试理解以下代码,acct1acct2是代表“银行帐户”的对象。

HashMap map = new HashMap();
map.put(acct1.hashCode(), acct1);
map.put(acct2.hashCode(), acct2);

for (Object o : map.values())
{
    System.out.println(o);
}

for (Object o : map.keySet())
{
    System.out.println(o);
}

根据BankAccount API,方法hashCode()会返回int,这应该是帐户的哈希值。

那么这不意味着keySet()创建的集合包含整数吗?如果是这样,为什么第二个for-each迭代器将其成员声明为Object。当我尝试将Object切换为int时,我遇到了编译错误。

1 个答案:

答案 0 :(得分:1)

map.put(...)隐式地对整数进行自动装箱,而整数也是一个对象,所以第二个就好了。如果你显式地转换为Integer而不是int你的Object(int是一个基本类型并且会产生编译错误)它可以工作:

@Test
public void mytest(){
    Object acct1 = new Object();
    Object acct2 = new Object();
    HashMap map = new HashMap();
    map.put(acct1.hashCode(), acct1);
    map.put(acct2.hashCode(), acct2);

    for (Object o : map.values())
    {
        System.out.println(o);
    }

    for (Object o : map.keySet())
    {
        System.out.println(o);
        System.out.println((Integer)o);
    }
}

编辑: 请注意,需要在for-each中使用Object,因为编译器不知道哪个特定对象存储为键,因此它使用Object,即"类的根层次结构。每个类都将Object作为超类" javadoc)。

如果要在for-each中使用Integer,则需要向编译器提示这是一个Map< Integer,Object>,只需使用泛型语法。这段代码将编译:

@Test
public void mytest(){
    Object acct1 = new Object();
    Object acct2 = new Object();
    HashMap<Integer, Object> map = new HashMap<>();
    map.put(acct1.hashCode(), acct1);
    map.put(acct2.hashCode(), acct2);

    for (Object o : map.values())
    {
        System.out.println(o);
    }

    for (Integer o : map.keySet())
    {
        System.out.println(o);
    }
}