帮别人的代码改bug,发现有一大堆bug是由get或者remove传递进去的参数类型不匹配而造成的。
比如:
上面的代码输出是null。
一般人很难发现传递进去的int和short类型不匹配,而且ide,编译器也没有提示。当然通过一些分析工具可以检查出来。
真的感到很困惑,java中的容器的一些函数,参数都是object类型,如hashmap中的get,remove函数,set中的contains函数。
为什么不明确它们的类型?这样编译器可以检查出类型不匹配的错误。
google之,google的一个工程师给出了答案:http://smallwig.blogspot.com/2007/12/why-does-setcontains-take-object-not-e.html
为了简单起见,以set容器为例:
定义一个简单的s,只有一个简单的contains函数:
假如我们有个函数,想要处理foo类的集合:
要是我们想能同时处理foo类的子类(如subfoo)的集合,那应该这样定义:
一切看起来很好,但是如果我们把代码都合起来,就会发现悲剧了:
这时编译器不干了,它表示不能工作了。
原来在s<k>类的定义中,我们明确contains(k k)函数只能接受一个明确类型的参数。
但是在dosomereading函数中,编译器无法确定到底是什么类型,它是foo类型,还是subfoo类型,还是subsubfoo类型?
编译器无从得知,所以它只允许null类型的参数。
===========================================================
对于这个解析,话说还是有点郁闷。
也有另外的解析,认为和equals函数有关系。不过感觉不大靠谱,这个只能说是一些另类的应用。
http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic