2010-11-03 55 views
4

下面的代码编译没有错误......这一次我更希望它失败:/Java泛型非问题在编译时

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

由于编译器知道在这个地图中使用的主要是字符类型,使用字符串键应该被标记为不正确。

我缺少什么?

回答

11

你不会错过任何东西。所有Map#get()调用只需要Object

根据实施,你可能会看到一个(运行时)ClassCastException当你传递一个StringMap<Character, Double>#get()


Here's why Map#get() isn't fully generic

+0

是的,这是正确的。字符串是一个对象:)我的IDE确实会发出警告 – 2010-11-03 14:08:21

+1

我认为这样做的目的是保存遗留代码。纠正我,如果我错了。 – Jeremy 2010-11-03 14:09:52

+0

完全正确(+1),尽管它是可怕的... – 2010-11-03 14:12:01

1

如果您尝试运行此代码,则缺少(可选)运行时异常(ClassCastException)。

1

该方法得到没有参数化与泛型参数只有结果是。

你也可以做

m.get(1L); //m.get(Object o); 

的参数化方法把

m.put(new String(), 0.0); //Fail 

//The method put(Character, Double) in the type Map<Character,Double> is not applicable for the arguments (String, double) 

m.put(new Character('c'), 0.0); //Ok 
0

get检索对象的参数是.equals()。一个对象可能是.equals()到另一个类的对象。