簡體   English   中英

Java HashMap作為方法參數-未指定“值”類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM