为什么Java中Map接口的get函数参数竟然是Object

https://www.jianshu.com/p/7889e4b32362

文章来源于自己实际开发项目中遭遇到的一个问题。在一开始,我定义了一个

Map<Integer, String> map;

这并没有说明问题,然后开始往下写了一堆函数,在写到第N个函数的时候,我发现这个map需要改成

Map<String, String> map;

改完之后我天真的以为ide能帮我检查出所有需要修改的地方,我只需要按照列出的红线一个一个的把传入参数的类型修改好就可以了,于是毫无疑问的,我的程序最后败在了这个地方

map.get(someIntegerParam);

改正程序中的问题只是一方面,更重要的是,为什么这个get函数就要这么特别,为什么不和put一样用范型作为参数呢!?google了一把,在stackoverflow上也有不少人问过这个问题,其中这一篇说的算比较好的,大概的意思就是说如果采用范型作为get的参数并不能很好的体现出map的精神,因为key是否相等,取决于key1.equals(key2)是否成立,这里并不应该限制类型。在sof上的另外一篇文章也阐述了这个问题,并引用了Josh Bloch的一段话:

Josh Bloch says (6:41) that they attempted to generify the get method of Map, remove method and some other, but "it simply didn't work". There are too many reasonable programs that could not be generified if you only allow the generic type of the collection as parameter type. The example given by him is an intersection of a List of Numbers and a List of Longs.

大概意思就是说我们曾经尝试过把get方法范型化,但是它挂了,有很多很多原因使他不能被范型化,比如你用List<Number>做key,但却想用List<Long>get

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值