簡體   English   中英

在Java中映射泛型

[英]Map generics in Java

我似乎對Java Generics有一些誤解,我希望你能幫助我。 我試圖像這樣創建一個地圖:

Map<Debater, int>

(Debater是我聲明的接口)但java抱怨int,所以我做了:

Map<Debater, Integer>

我想這是因為int不是一個類,而Integer是,這是正確的嗎?

此外,現在我得到一個Debater,我需要在地圖中添加1到它的值。 我怎么做?

是的,你是對的。

至於遞增:

map.put(debater, map.get(debater) + 1);

自動裝箱將負責對象和基元之間的“切換”。

請注意,如果您已經在地圖中沒有此debater的值,則此(如注釋中所述)將拋出NullPointerException 因此,如果你想做二合一,可以按如下方式重新加工:

map.put(debater, map.containsKey(debater) ? map.get(debater) + 1 : 1);

那是對的。 Map只能保存Object

此外,現在我得到一個辯手,我需要在地圖中添加1 它的 值。 我怎么做?

我建議您為此獲取AtomicInteger ,以便在多線程環境中更加安全。

Map<Debater, AtomicInteger> map = new HashMap<Debater, AtomicInteger>();
// ...

map.get(debater).incrementAndGet();

否則,您需要添加更多代碼來synchronize更新,以避免線程獲得“錯誤”值。

我想這是因為int不是一個類,而Integer是,這是正確的嗎?

正確。

此外,現在我得到一個Debater,我需要在地圖中添加1的值。 我怎么做?

這應該做的伎倆:

map.put(debater, map.get(debater)+1);

你是對的,這是因為你必須指定一個類。

至於你的問題,你必須這樣做:

myMap.put(myDebater, myMap.get(myDebater) + 1);

int和Integer之間的所有轉換都將通過自動裝箱完成。

你對int與Integer部分是正確的。

要安全地增加值,請使用:

Integer currentValue = map.get(debater);
if(currentvalue == null) {
    map.put(debater, 1);
} else {
    map.put(debater, currentValue  + 1);
}

或者你可以先使用map.contains(debater)如果你想處理一個debater未單獨包含在地圖中的情況。

Java不允許在泛型中使用原始類型。 幸運的是,每個基本類型都有一個“box”引用類型,例如Integer for intBoolean for boolean等。語言知道這種關聯,並且可以為你做自動裝箱和拆箱。 這意味着您可以執行以下操作:

 Integer i = 5;
 i++;

您必須注意自動裝箱/拆箱的一些注意事項。 典型的例子如下:

 List<Integer> list = new ArrayList<Integer>();
 list.add(3);              // this is autoboxed, and calls list.add(E)
 list.remove(3);           // this invokes list.remove(int) overload !!!!
 list.remove((Integer) 3)  // this is how you call list.remove(E)

你會發現上面的代碼將拋出IndexOutOfBoundsException ,因為第一個remove嘗試刪除第3個元素,而不是元素3。

您不能使用原始類型(例如intfloatchar等)作為泛型類型 - Java中的集合是通用的。 這就是你必須使用Integer而不是int

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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