现在需要向页面返回一个Map,这个Map包含两对键值,
第一对是(String,String),第二对是(String,List<MyCard>),
这里MyCard是系统中的一个类,想问一下,用泛型如何操作这个Map,即下面的cardsMap。代码如下:********action中的代码:***********
……
private Map cardsMap = new HashMap();public String execute() throws Exception {
  Cardsdao cardsdao = new Cardsdao();
  cardsMap = cardsdao.getListStrMap();
  if (!cardsMap.isEmpty()) {
return SUCCESS;
  } 
}
********Cardsdao 中的代码:********
……
public Map getListStrMap() {
  Map tempMap = new HashMap();
  try {          
    ……
    List<MyCard> myCardList = ……//这里由另外的函数返回卡的消费信息。
     String name = ……//这里由另外的函数返回卡的持有人姓名          
    tempMap.put("list", myCardList);
    tempMap.put("str", name);
    ……               
  } catch(RuntimeException re) {

  }
  return tempMap;
}求教,用JAVA泛型如何改写以上代码。

解决方案 »

  1.   

    可以匹配子类或父类泛型 <XX extends OBJECT> 好象是这样写的...extends是匹配至的意思....
      

  2.   

    似乎不大可能,只有用Object了,取出来以后再用MyCard转型public   Map<String, Object>   getListStrMap()   { 
        Map<String, Object>   tempMap   =   new   HashMap<String, Object>(); 
        try   {                 
            …… 
            List <MyCard>   myCardList   =   ……//这里由另外的函数返回卡的消费信息。 
              String   name   =   ……//这里由另外的函数返回卡的持有人姓名                 
            tempMap.put( "list ",   myCardList); 
            tempMap.put( "str ",   name); 
            ……                         
        }   catch(RuntimeException   re)   {     } 
        return   tempMap; 
      

  3.   

    你这样的写法就不是很好,似乎可以改成:Map<String, MyCard> tempMap = new HashMap<String, MyCard>();List <MyCard> myCardList = ……//这里由另外的函数返回卡的消费信息。 
    String name = …………//这里由另外的函数返回卡的持有人姓名                 
    myCardList.setName(name); // 在MyCard中增加name字段和setter/getter。
    tempMap.put("list", myCardList); // 一起添加进去。
      

  4.   

    楼上这位,楼主的Map中可又要放MyCard,又要放String啊
      

  5.   

    Map<String, MyCard> map = new HashMap<String, MyCard>();
    这个是JDK1.5的新特征吧.
      

  6.   

    谢谢各位的关注,1)to 9楼 火龙果:
    你的方法应该可行,不过这次不用了,手头上的是旧程序,我不想改的太多。2)to 1~12楼:
    我用3楼的方法试了一下,居然可行,我真是糊涂了,
    我也是刚刚试着用“泛型”,按资料上说,3楼的方法行不通的,“泛型指南”上提到:
    如果Foo是Bar的一个子类型,而G是某种泛型声明,那么G<Foo>是G<Bar>的子类型并不成立!! 换句话说:tempMap<String, Object> 与  tempMap<String, myCardList<MyCard>>是两回事,
    那句 tempMap.put( "list ",   myCardList); 应该报错了?可现在程序正常,(重新编译过,也重启过TOMCAT),糊涂了,应该如何理解泛型?有谁能告诉我?此帖一定会借的。
      

  7.   

    楼主,所有的类都隐性继承Object,也就是说所有类是Object的子类
    将map定义成tempMap <String,   Object>,然后tempMap.put("list", myCardList);  
    myCardList是list,也是Object的子类,语法上是肯定没有问题的,
    但是你从tempMap中取出来的也都是Obejct了,需要再进行强制转换
    (MyCard)tempMap.get("list"); 
    不出意外的话,jdk1.5会在这句报安全警告,但程序运行是没问题的,
    你可以加上 @SuppressWarnings("unchecked")来取消警告
      

  8.   

    另外,你的map里要放String和MyCard两种类型,这本就不符合Collection接口
    的设计,所以只能用Object了,随便放什么都行的通
      

  9.   

    myCardList <MyCard> 是一个List 
    List 继承 Object 
    不对吗?
      

  10.   

    换句话说:tempMap <String,   Object>   与     tempMap <String,   myCardList <MyCard> > 是两回事,
    那句   tempMap.put(   "list   ",       myCardList);   应该报错了?Java 是单根继承所有类型都可转成Object, 你只要把myCardList <MyCard>也看成
    Object就容易理解了Java泛型和C++模板最大的不同就是Java泛型是用擦除实现的,你用反射看一下Map里面对象的类型信息好了,都被擦除成
    Object了
      

  11.   

    得啦,帖子不够五天,不让加分,我这里先结贴,疑问以后再说吧!如果是一般情况下,各个类型依次继承于Object,这是常识,但现在我想问的是基于“JAVA泛型”的情况,正如我在13楼提到的,“如果Foo是Bar的一个子类型,而G是某种泛型声明,那么G <Foo> 是G <Bar> 的子类型并不成立!! ”这一概念在泛型说明中一再提到,显然现在代码通是通了,但如果按照14~17楼的解释,还是显得很牵强。最后,谢谢15楼的提醒!现在结贴啦!