[英]Java HashMap as method parameter - not specifying the “value” type
這是關於Java語法的問題。 我沒有被困住。
對於列表,假設我有一個字符串列表。
List<String> mylist;
只要不需要訪問列表中的元素,就可以將該列表稱為List
(與List<String>
)。
所以我可以有一個像這樣的方法:
public int listSize(List list) {
return list.size();
}
現在假設我有一個HashMap
。
HashMap<String, String> myhash;
還有一種訪問鍵但從不訪問值的方法 :
public boolean hashContainsKey(HashMap<String, String> hash, String key) {
return hash.containsKey(key);
}
有沒有一種很好的方法僅指定HashMap的“鍵”部分?
像HashMap<String>
?
我希望您的示例只是為了展示您的想法,而不是您將要編寫的東西,因為編寫這樣的方法是毫無意義的。
一種方法是對類型param使用通配符:
您的第一個示例應如下所示
// Should be static in this example
public static int listSize(List<?> list) {
return list.size();
}
另一個應該是:
// It is, imho, irrational to deal with HashMap specifically,
// and again, this should be static
public static boolean mapContainsKey(Map<String, ?> map, String key) {
return map.containsKey(key);
}
甚至更好:
public <T> static boolean mapContainsKey(Map<T, ?> map, T key) {
return map.containsKey(key);
}
關於為何對原始類型( List
)使用通配符( List<?>
)的很少更新
在OP的示例中,差異可能並不明顯。 但是,它們並不等效。
例如:
public void foo(List list1, List list2) {
list1.addAll(list2);
}
以上是合法的,但是如果您使用foo(aStringList, anIntegerList);
調用foo(aStringList, anIntegerList);
,結果將是災難性的: String
列表現在將包含Integer
,所有內容都混亂了。
但是如果你寫
public void foo(List<?> list1, List<?> list2) {
list1.addAll(list2);
}
盡管list1和list2允許傳入任何List<XXX>
,但無需顯式告知編譯器它們是同一類型,則編譯器將假定?
在list1和?
在list2中可以代表不同的事物,因此list1.addAll(list2);
的編譯失敗list1.addAll(list2);
,這樣可以避免您編寫諸如此類的愚蠢內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.