大家看看我的程序.public <T extends GenericManager,U extends BaseUnitPrice> String saveCont(T feeManager,U feePara) throws Exception {
//判断所属项目id是否和program+region一致
String prokey = feePara.getProject().getProgramName() + Constants.STRING_DELIMITER + feePara.getProject().getRegion();
Long proid = (Long)((Map) ActionContext.getContext().getApplication().get(Constants.AVAILABLE_PRONAMES)).get(prokey);
if (proid==null) {
addFieldError(feePara+".project.region",getText("errors.invalid",new String[]{getText("project.region")}));
return INPUT;
}
Project pro=(Project)((Map)ActionContext.getContext().getApplication().get(Constants.AVAILABLE_PROJECTS)).get(proid);
feePara.setProject(pro);
String message=pro.getRegion()+pro.getName();
SaveContAndAtt(message,feeManager,feePara);
feePara = feeManager.get(feePara.getId());
boolean isNew = (feePara.getId() == null);
try{
feeManager.save(feePara);
}catch(DataIntegrityViolationException e){
addFieldError(feePara+".project.id",getText("errors.existField",new String[]{getText("project.region")}));
return INPUT;
}
String key = (isNew) ? feePara+".added" : feePara+".updated";
saveMessage(getText(key));
if (!isNew) {
return INPUT;
} else {
return SUCCESS;
}
}这个方法里标红的一句就是出错的地方,因为通过get得到的对象是Java.lang.Object类型,而前面的对象是一个传递过来的,不确定的对象类型,这里就出现了个转换的问题.请高手指教下.
//判断所属项目id是否和program+region一致
String prokey = feePara.getProject().getProgramName() + Constants.STRING_DELIMITER + feePara.getProject().getRegion();
Long proid = (Long)((Map) ActionContext.getContext().getApplication().get(Constants.AVAILABLE_PRONAMES)).get(prokey);
if (proid==null) {
addFieldError(feePara+".project.region",getText("errors.invalid",new String[]{getText("project.region")}));
return INPUT;
}
Project pro=(Project)((Map)ActionContext.getContext().getApplication().get(Constants.AVAILABLE_PROJECTS)).get(proid);
feePara.setProject(pro);
String message=pro.getRegion()+pro.getName();
SaveContAndAtt(message,feeManager,feePara);
feePara = feeManager.get(feePara.getId());
boolean isNew = (feePara.getId() == null);
try{
feeManager.save(feePara);
}catch(DataIntegrityViolationException e){
addFieldError(feePara+".project.id",getText("errors.existField",new String[]{getText("project.region")}));
return INPUT;
}
String key = (isNew) ? feePara+".added" : feePara+".updated";
saveMessage(getText(key));
if (!isNew) {
return INPUT;
} else {
return SUCCESS;
}
}这个方法里标红的一句就是出错的地方,因为通过get得到的对象是Java.lang.Object类型,而前面的对象是一个传递过来的,不确定的对象类型,这里就出现了个转换的问题.请高手指教下.
这个放在Java代码里了.不显示红的.try上面的第二句
“而前面的对象是一个传递过来的,”
不懂什么意思
feeManager.get(feePara.getId());这里没有用泛型
需要强行转换,但不知道实际类型。可以用feePara.getClass().getName()来得到类型。
然后将其转换。
U extends BaseUnitPrice
U feePara
就是说你的feePara是BaseUnitPrice类型的、或是BaseUnitPrice的子类。
而你得到的feeManager.get(feePara.getId());是一个object类型的,如果可以 你可以让
feeManager.get(feePara.getId());返回的值继承BaseUnitPrice或其子类;
如果一味的将feeManager.get(feePara.getId());转换成BaseUnitPrice类型,但是feeManager.get(feePara.getId());
可能是其他的类型,有可能类型转换错误。
应该可以这样转换,将object转换成T类型
feePara = (T)feeManager.get(feePara.getId());
最好是改feeManager.get(feePara.getId())方法,让它的返回值是T:
public class FeeManager<T> {
public T get(int id){
.......
}
}
feePara = feeManager.get(feePara.getId())<T>;
不过要保证 Object 与 U 同类型or 子类即可 不然就会报错 classCastException
如果我用"可以用feePara.getClass().getName()来得到类型。"取得了他的对象类型.
那么应该怎么样把feeManager.get(feePara.getId());转成我得到的这个类型那?
定义的泛型是可以用来转换滴
拿出来Object你直接转一下就好嘛.! 但是你要保证你查询出来的是U或者U的子类!
feePara = (U)(feeManager.get(feePara.getId()));
这样搞一下就行
在java中有一个eval的方法,可以将字符串转换成对象。类似于js的eval方法
不过在jdk1.5+
eval(feePara.getClass().getName()) o = (eval(feePara.getClass().getName())) feeManager.get(feePara.getId());
Snake snake = new Snake(); Object object = getObject(); // 参数一个对象。一个类型
snake = initObject(getObject(), snake); // 结果得到了 从Object 得到的Snake
System.out.println(snake.getName()); } /**
* 把Object 转化成指定泛型类型对象
*
* @param <T>
* @param object
* @param param
* @return
*/
public static <T> T initObject(Object object, T param) { return (T) param.getClass().cast(object); } /**
* 这里好比你的 get方法 返回的正是 Object
*
* @return
*/
public static Object getObject() { return new Snake("snake", 1);
}}class Snake { private String name; private Integer age; public Snake() {
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Snake(String name, Integer age) {
this.age = age;
this.name = name;
}
}