大家看看我的程序.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类型,而前面的对象是一个传递过来的,不确定的对象类型,这里就出现了个转换的问题.请高手指教下.

解决方案 »

  1.   

    feePara = feeManager.get(feePara.getId());
    这个放在Java代码里了.不显示红的.try上面的第二句
      

  2.   

    Project pro=(Project)((Map)ActionContext.getContext().getApplication().get(Constants.AVAILABLE_PROJECTS)).get(proid);这句么?
    “而前面的对象是一个传递过来的,”
    不懂什么意思
      

  3.   


    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>;
      

  4.   

    feePara = feeManager.get(feePara.getId());修改成下面这样就行了!Object object = feeManager.get(feePara.getId())feePara =  (U)feePara.getClass().cast(object);
    不过要保证  Object 与 U 同类型or 子类即可  不然就会报错 classCastException
      

  5.   


    如果我用"可以用feePara.getClass().getName()来得到类型。"取得了他的对象类型.
    那么应该怎么样把feeManager.get(feePara.getId());转成我得到的这个类型那?
      

  6.   

    feePara = (U)(feeManager.get(feePara.getId()));
    定义的泛型是可以用来转换滴
    拿出来Object你直接转一下就好嘛.!   但是你要保证你查询出来的是U或者U的子类!
      

  7.   

    LZ你不就是要把你拿出来的类型转成U吗.?
    feePara = (U)(feeManager.get(feePara.getId()));
    这样搞一下就行
      

  8.   


    在java中有一个eval的方法,可以将字符串转换成对象。类似于js的eval方法
    不过在jdk1.5+
    eval(feePara.getClass().getName()) o = (eval(feePara.getClass().getName())) feeManager.get(feePara.getId());
      

  9.   

    除非你数据有误!下面的代码是我做的一个小测试!没一点问题! package com.ty.beans;import com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt.GetOpt;public class Test2 { public static void main(String args[]) { // 这里并没有初始化
    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;
    }
    }