当我在地图中使用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");
}
}
答案 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)
,它们不必是同一类型。