使用无效类的Java通用类型get调用不会导致编译器错误

时间:2013-12-03 07:29:42

标签: java generics compiler-errors

为什么这个Java代码不会产生任何编译器错误?

Map<String, String> m = new HashMap<String, String>();
m.get(1);

我尝试在地图中找到一个将字符串映射到字符串的整数。这显然是编程错误。

同样,此代码也不会产生错误:

Map<Integer, String> m = new HashMap<Integer, String>();
m.get("dd1");

因此Java编译器似乎没有检查Map.get(Object)方法的参数类型。有什么想法吗?

6 个答案:

答案 0 :(得分:4)

  

Java编译器似乎没有检查Map.get(Object)方法的参数类型。

当然可以。它检查它是Object.没有别的东西可以检查。唯一可能存在“无效类”的方法是使用基本类型。

答案 1 :(得分:3)

Map interface get方法将Object作为参数。

两种情况都没有错误。唯一的问题是它必须是一个Object,如果equals方法满足于传递的Object,那么该值将返回。

答案 2 :(得分:2)

此处的

m.get(Object);参数对地图中的任何对象类型都有效。所以这不会给你编译错误。

答案 3 :(得分:0)

通常在插入时检查。在put方法中。

map中没有插入错误数据,然后在使用get方法获取数据时无需检查

答案 4 :(得分:0)

正如您在(Java-Map)的文档中看到的那样,get方法不使用泛型注入,而是使用Object作为输入参数。因此,您将在运行时获得ClassCastException。这与使用泛型类型注入的put方法不同。

答案 5 :(得分:-1)

它会检查你的put动作和返回值(public V get(Object key)),而不是所有动作。