文章來源于自己實際開發(fā)項目中遭遇到的一個問題。在一開始刻盐,我定義了一個
Map<Integer, String> map;
這并沒有說明問題诸尽,然后開始往下寫了一堆函數(shù),在寫到第N個函數(shù)的時候,我發(fā)現(xiàn)這個map
需要改成
Map<String, String> map;
改完之后我天真的以為ide能幫我檢查出所有需要修改的地方请祖,我只需要按照列出的紅線一個一個的把傳入?yún)?shù)的類型修改好就可以了订歪,于是毫無疑問的,我的程序最后敗在了這個地方
map.get(someIntegerParam);
改正程序中的問題只是一方面肆捕,更重要的是刷晋,為什么這個get
函數(shù)就要這么特別,為什么不和put
一樣用范型作為參數(shù)呢I髁辍眼虱?google了一把,在stackoverflow上也有不少人問過這個問題荆姆,其中這一篇說的算比較好的蒙幻,大概的意思就是說如果采用范型作為get
的參數(shù)并不能很好的體現(xiàn)出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.
大概意思就是說我們曾經(jīng)嘗試過把get
方法范型化抒和,但是它掛了,有很多很多原因使他不能被范型化彤蔽,比如你用List<Number>
做key摧莽,但卻想用List<Long>
來get
。