這是Map
的接口合同 - 因此您必須按照原樣執行合同。
不過,我認爲有兩個原因,爲什麼Map
這部分的設計是一件好事:
i)本Map
contract是,你可以在下列情況下得到的映射值:
如果此映射包含從密鑰k到值v的映射,使得 (key == null?k == null:key.equals(k)),則此方法返回v; 否則返回null。如果此映射包含指定鍵的映射關係
返回true:(可以有至多一個這樣的映射。)
或等價,而具體到你的問題有關containsKey(Object key)
。更正式地說,當且僅當此映射包含關鍵字k的映射(key == null?k == null:key.equals(k))時才返回true。 (可以有至多一個這樣的映射。)
這樣,你不關心打字,而是平等。
II)這是真的只是同一個點,但考慮到以下幾點:
Map<String, Integer> map = new HashMap<>();
String key = "A Key";
Integer value = 1;
map.put(key, value);
Object objectKey = key; // this is the same key object, but it is typed as Object
map.containsKey(objectKey); // what would you want/expect this to return?
map.get(objectKey); // ...or this?
因此,對於您的實現的Map
,我不會建議只是鑄造Object
鍵(你會得到一個運行時異常...)。你決定如何實現它取決於你的設計。讓我們設想一下,你在保存類型列表中的鍵和值...然後你會被告知鑄造前檢查instanceof
的Object
鍵:
public boolean containsKey(Object key) {
if (key instanceof K) {
// do your thing...
} else {
return false;
}
}
注意instanceof
檢查基礎對象的類型,而不是其聲明的類型,所以:
String key = "A Key";
Object objectKey = key;
boolean isString = (objectKey instanceof String); // is true
真的,我會建議,而不是詢問如何給力的東西,違背了合同Map
,你要會問這個問題"why is the contract that way?」 ......
你的第二個陳述是什麼意思? –
這個問題有一些有趣的答案,爲什麼'Map'接口不使用通用類型的某些方法參數:http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject關鍵不是完全通用的 – andersschuller
@RohitJain我編輯了這個問題。希望它更好地知道。但是代碼舉例說明,由於接口契約,我必須處理一個對象,但我希望V確信我有可能依賴於ValueInterface屬性。 – fabiim