gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:20:53 27 4
gpt4 key购买 nike

我试图理解以下代码,其中 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 ,我遇到了编译器错误。

最佳答案

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com