为什么这个代码与泛型编译?

时间:2009-07-17 19:05:39

标签: java generics

这似乎是一个愚蠢的问题,但此刻我正在绊倒它。为什么这会编译?

import java.util.*;

public class Test {
        public static void main (String[] argv) throws Exception {
                Map<String,String> map = new HashMap<String,String>();
                map.get(new ArrayList<String>());
        }
}

使用与“String”不兼容的东西调用get不应该是非法的吗?

4 个答案:

答案 0 :(得分:3)

来自Map的Javadoc:

V get(Object key)
  

返回值的值   指定的键是映射的,如果是,则为null   此地图不包含地图   键。

get只是一个接收任何对象的方法,并且(如果存在)将返回映射到它的对象。因此,传递非字符串是合法的,但是,因为所有键必须是字符串,所以如果传入非字符串,则总是为null。

答案 1 :(得分:1)

参见this 另外this

答案 2 :(得分:1)

Map的{​​{3}}方法只需Object,而不是通用类型K

代码将编译,但永远不会从Map中获取任何内容。

答案 3 :(得分:1)

Map.get采用Object,而不是通用类型,参见documentation

  

get(Object key):返回指定键映射到的值,如果此映射不包含键的映射,则返回null。

重要的是它返回一个泛型类型,因此您不必转换返回值。