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

标签 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 ,我遇到了编译器错误。

最佳答案

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/

相关文章:

java - 在 IntelliJ 中每次 git pull 后生成的源根消失了

java - 背景可绘制对象未在真实设备中显示

java - 如何防止我的递归斐波那契数列生成超过 4,000,000 的值?

java - 如何处理黑莓上的屏幕旋转

java - 使用 AnnotatedCompositeSerializer 放置的 Astyanax 复合列在几个小时后通过多个客户端变得无法获取

java - Ant 任务 : In ant build i am using java task, 我使用了 system.out.println ,但它没有出现在 Eclipse 控制台中

java - @ModelAttribute 注解参数的数据绑定(bind)

java - 如果应用程序中有多个版本的 jar,如何查找 Jvm 正在使用哪个版本

java - 从其他目录运行 gradle 命令

Java 泛型和数字类型