嵌套hashmap中的java泛型/继承

时间:2009-08-27 13:37:15

标签: java generics inheritance hashmap

如果我有两个类型

的哈希图
HashMap<Integer, HashMap<Integer, Police>> time_id_police;  
HashMap<Integer, HashMap<Integer, Ambulance>> time_id_ambulance;

警察和救护车都延伸救援,我怎么能有像

这样的方法
HashMap<Integer, HashMap<Integer, Rescue>> getRescue(){
   if (a) return time_id_police;
   else return time_id_ambulance;
}

既不是这样,也不是将返回类型改为

HashMap<Integer, HashMap<Integer, ? extends Rescue>> 

似乎有效。

非常感谢。

2 个答案:

答案 0 :(得分:3)

显然HashMap<Integer, HashMap<Integer, Rescue>>是错误的,因为可以在time_id_police中使用HashMap<Integer, Ambulance>替换值。如果您将Rescue替换为? extends Rescue,则可以执行类似的操作。

但是,使用? extends两次会给我们一些不会破坏类型系统的东西。

HashMap<Integer, ? extends HashMap<Integer, ? extends Rescue>> getRescue() {

大多数Java程序员喜欢在类型中使用更通用的Map而不是特定的实现。

Map<Integer, ? extends Map<Integer, ? extends Rescue>> getRescue() {

顺便提一下,如果您更改方法的主体以使用更简洁的三元运算符:

   return a ? time_id_police : time_id_ambulance;

您会收到一条稍微有用的错误消息,因为编译器为您编写了类型:

R.java:18: incompatible types
found   : java.util.HashMap<java.lang.Integer,capture of ? extends java.util.HashMap<java.lang.Integer,? extends Rescue>>
required: java.util.HashMap<java.lang.Integer,java.util.HashMap<java.lang.Integer,Rescue>>
   return a ? time_id_police : time_id_ambulance;
        ^
1 error

答案 1 :(得分:0)

将time_id_police和time_id_ambulance的声明更改为

HashMap<Integer, HashMap<Integer, Rescue>> time_id_police;
HashMap<Integer, HashMap<Integer, Rescue>> time_id_ambulance;

您可能还想将它们声明为Map而不是HashMap,这样如果您决定更改您使用的Map实现,您只需要在一个地方(您实例化您的对象)进行更改而不是在许多地方(你使用你的对象)

Map<Integer, Map<Integer, Rescue>> time_id_police = new HashMap<Integer, HashMap<Integer, Rescue>>();