热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在JavaHashMap中限制get方法的对象类型

如何解决《在JavaHashMap中限制get方法的对象类型》经验,为你挑选了1个好方法。

我已经像这样实例化了我的HashMap:

Map myHashMap = new HashMap();

的数据类型Key为String,因此当我尝试在地图中插入新的键值对并保持KeyInteger时,它将引发错误。

myHashMap.put(1L, "value");

这意味着在put方法中,他们已经限制了的数据类型Key。但是,当使用get方法从映射中获取值时,它并不会检查的数据类型Key。因此,如果我写这样的东西,它不会给出编译错误。

myHashMap.get(1L);

get在Java Map界面中检查了该方法,其参数类型为Object,因此这就是为什么它允许将任何Object用作put方法参数的原因。

V get(Object key)

有什么方法可以限制在get方法中作为参数传递的数据类型?

我传递的参数应具有与Key实例化哈希映射时使用的数据类型相同的数据类型。



1> Fullstack Gu..:

这样设计是因为在get操作过程中,仅equalsand hashCode用于确定要返回的对象。该get方法的实现不检查用作键的Object的类型。

在您的示例中,您尝试通过传递long来获取值myHashMap.get(1L);,首先,将使用Long具有该值的对象的哈希码1L来确定要从中查找的存储桶。接下来,使用equals的方法来查找要从中返回值的映射的确切条目。在定义明确的equals方法中,始终要检查类型:

public boolean equals(Object obj) {
    if (obj instanceof Long) { //here type is checked
        return value == ((Long)obj).longValue();
    }
    return false;
}

因此,如果类型不相等,则该equals方法将返回false,因此get也将返回null

在某些情况下(例如,List用作键时),可能会发生这样的情况:您使用say的实例在地图上放置了一个项目,ArrayList但是您可以使用的实例成功检索相同的值LinkedList。由于两者都实现了List接口。

Map, String> myHashMap = new HashMap<>();
List arrayList = new ArrayList<>();
List linkedList = new LinkedList<>();
myHashMap.put(arrayList, "foo");
System.out.println(myHashMap.get(linkedList));

上面的代码将在控制台中输出foo

尽管实现不同,但是如果您检查的equals方法ArrayList,则仅检查类型是否为List

public boolean equals(Object o) {
        if (o == this) {
            return true;
        }

        if (!(o instanceof List)) { //checking type of super interface
            return false;
        }
        ...
}

的情况也是如此LinkedList


这是一个很好的示例,说明了如何在StackOverflow中编写答案-格式正确,内容丰富,并带有针对性的代码示例。做得好!
推荐阅读
author-avatar
mobiledu2502870747
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有