2009-07-17 64 views
2

这似乎是一个愚蠢的问题,但我现在绊倒它。为什么编译?为什么这个代码与泛型编译?

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是不是非法?

+0

运行FindBugs,它会抱怨get()中使用的不良对象类型。 – akarnokd 2009-07-17 19:09:54

+0

作为提问者,我投票结束为一个愚蠢的:http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-通用 – jsight 2009-07-17 19:14:00

+0

+从我身边关闭。 – akarnokd 2009-07-17 19:36:20

回答

3

从的Javadoc Map

V get(Object key) 

返回如果 此映射包含没有映射到其中 指定键所映射的值,或空密钥 。

get只是一个接受ANY对象的方法,并且将(如果存在)返回映射到它的对象。所以传递一个非字符串是合法的,但是,因为所有的键都必须是字符串,所以如果你传递一个非字符串,你总是会得到空值。

1

方法Map只需要一个Object,而不是通用类型K

该代码将编译,但永远不会从地图中获得任何东西。

1

Map.get需要一个Object,而不是一个通用类型,比较。 documentation

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

重要的是它返回一个泛型类型,所以你不必转换返回值。

相关问题