java中的奇怪编译错误

时间:2014-04-09 01:29:42

标签: java

我正在尝试传递类型的变量:

HashMap<Foo, HashSet<Bar>>

到一个方法,它期望:

Map<Foo, Set<Bar>>

我认为它应该可行,但我收到以下编译错误:

java: method setMenu in class com.xx.client.layout.Layout cannot be applied to given types;

  required: java.util.Map<com.xx.shared.model.UserType,java.util.Set<com.xx.shared.dto.model.MenuItemDTO>>

  found: java.util.HashMap<com.xx.shared.model.UserType,java.util.HashSet<com.xx.shared.dto.model.MenuItemDTO>>

  reason: actual argument java.util.HashMap<com.xx.shared.model.UserType,java.util.HashSet<com.xx.shared.dto.model.MenuItemDTO>> 

cannot be converted to 

java.util.Map<com.xx.shared.model.UserType,java.util.Set<com.xx.shared.dto.model.MenuItemDTO>> 

by method invocation conversion

1 个答案:

答案 0 :(得分:2)

试图说服你,给出一个

HashMap<Foo, HashSet<Bar>> myMap;

你希望做到

HashSet<Bar> aHashSet = myMap.get(aFoo);

但如果你有

public void someMethod(Map<Foo, Set<Bar>> aMapParameter) {...}

和预期

someMethod(myMap); 

开始工作,然后someMethod就可以了

public void someMethod(Map<Foo, Set<Bar>> aMapParameter) {
    aMapParameter.put(aFoo, new TreeSet<>());
}

你原来的

HashSet<Bar> aHashSet = myMap.get(aFoo);

会因ClassCastException而失败。

编译时间类型安全必须保证不会发生这种情况。因此编译器不允许该方法调用。

相关: