现在需要向页面返回一个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泛型如何改写以上代码。
第一对是(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泛型如何改写以上代码。
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;
}
String name = …………//这里由另外的函数返回卡的持有人姓名
myCardList.setName(name); // 在MyCard中增加name字段和setter/getter。
tempMap.put("list", myCardList); // 一起添加进去。
这个是JDK1.5的新特征吧.
你的方法应该可行,不过这次不用了,手头上的是旧程序,我不想改的太多。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),糊涂了,应该如何理解泛型?有谁能告诉我?此帖一定会借的。
将map定义成tempMap <String, Object>,然后tempMap.put("list", myCardList);
myCardList是list,也是Object的子类,语法上是肯定没有问题的,
但是你从tempMap中取出来的也都是Obejct了,需要再进行强制转换
(MyCard)tempMap.get("list");
不出意外的话,jdk1.5会在这句报安全警告,但程序运行是没问题的,
你可以加上 @SuppressWarnings("unchecked")来取消警告
的设计,所以只能用Object了,随便放什么都行的通
List 继承 Object
不对吗?
那句 tempMap.put( "list ", myCardList); 应该报错了?Java 是单根继承所有类型都可转成Object, 你只要把myCardList <MyCard>也看成
Object就容易理解了Java泛型和C++模板最大的不同就是Java泛型是用擦除实现的,你用反射看一下Map里面对象的类型信息好了,都被擦除成
Object了