簡體   English   中英

在地圖中使用Enum作為類型時的奇怪行為

[英]Strange behavior when using Enum as type in Map

當我在地圖中使用枚舉作為類型時,如果我使用類型不同的鍵,則不會出現編譯時錯誤。 例如,在下面的代碼片段中,當我嘗試使用類型為String的鍵訪問地圖時,我預計會發生編譯時錯誤。

為什么在Map中使用泛型時泛型不提供編譯時安全性? 當我嘗試插入條目時,編譯時檢查有效。

使用List時,情況似乎並非如此,因為我遇到了編譯時錯誤。

考慮下面的代碼示例

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class TestEnumGeneric{

    enum Sample{
            A,B
        }
    enum Sample2 {
          C,D
        }
    Map<Sample,String> someMap = new HashMap<Sample, String>();
    Map<String,String> someOtherMap = new HashMap<String, String>();
    List<Sample> someList = new ArrayList<Sample>();

    public void testMapWithEnum() {
        String value = someMap.get("123");
        value = someMap.get(Sample2.C);
        String value2 = someOtherMap.get(1);
        //someMap.put("123","123");
        //someList.add("123");
    }
}

Map.get的簽名是

V get(Object key);

因此它接受任何Object但僅返回V 使用get編譯時沒有錯。

NetBeans警告此用法:

對java.util.Map.get的可疑調用:給定對象不能包含String的實例(預期的Sample)

Map.put的簽名是

V put(K key, V value);

因此,您必須使用正確的類型。

編輯:

引用JavaDoc:

如果此映射包含從鍵k到值v的映射,使得(key==null ? k==null : key.equals(k)) ,則此方法返回v 否則返回null

只是key.equals(k) ,它們不必是同一類型。

暫無
暫無

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

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