我试图理解以下代码,其中 acct1
和acct2
是代表“银行帐户”的对象。
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
,我遇到了编译器错误。
最佳答案
map.put(...) 隐式地对整数进行自动装箱,而整数也是对象,因此第二个 for 就可以了。如果您显式转换为 Integer 而不是 int 您的对象(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,即“类层次结构的根”。每个类都有对象作为父类(super class)” ( javadoc )。
如果你想在 for-each 中使用 Integer,你需要向编译器提示这是一个 Map
@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);
}
}
关于java - 为什么整数 keySet 成员声明为对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37601992/