Java Generics - 如何使用后继对象调用通用映射

时间:2015-01-25 12:28:10

标签: java generics

我写了以下方法

 validate(Map<String,IAnimal> map)

我想用

来称呼它
dogMap = new HashMap<String,Dog>;
...
validate(dogMap)

其中Dog是Animal的继承者,
但它没有编译 如何更改它以便我可以使用后继对象调用它? 感谢。

3 个答案:

答案 0 :(得分:4)

您可以将validate的签名更改为:

validate(Map<String,? extends IAnimal> map)

这将允许您传递任何带有String键的地图以及扩展或实施IAnimal的值。

答案 1 :(得分:2)

您必须使用类型边界声明方法:

validate(Map<String,? extends IAnimal> map)

有关Java(有界)通配符的进一步说明,请参阅http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

答案 2 :(得分:2)

您有两种选择:

  1. validate的签名更改为YourReturnType validate(Map<? extends String, ? extends IAnimal> map)(假设您不想向其中添加元素)。
  2. 从您要传递的Map<String, IAnimal>创建一个新的dogMapnew HashMap<String, IAnimal>(dogMap)并将该对象传递给validate