在地图中使用Enum作为类型时的奇怪行为

时间:2014-07-11 09:01:43

标签: java generics

当我在地图中使用Enum作为类型时,如果我使用类型不同的键,则不会出现编译时错误。例如,在下面的代码片段中,我尝试使用类型为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");
    }
}

1 个答案:

答案 0 :(得分:2)

Map.get的签名是

V get(Object key);

因此它接受任何Object,但只返回V。使用get编译时没有错。

NetBeans警告这种用法:

  

对java.util.Map.get的可疑调用:给定对象不能包含String的实例(期望的样本)

Map.put的签名是

V put(K key, V value);

所以你必须使用正确的类型。

修改

引用JavaDoc:

  

如果此地图包含从密钥k到值v的映射,使(key==null ? k==null : key.equals(k)),则此方法返回v;否则返回null

唯一重要的是key.equals(k),它们不必是同一类型。