Java 铸造与功能参数化

Java 铸造与功能参数化,java,parameters,casting,abstraction,Java,Parameters,Casting,Abstraction,我有一个带有泛型函数的类,我希望对不同的对象类型重用它,以避免冗余代码 据我所见,在这种情况下有两种方法,即: 在泛型函数中返回Object,并在每次使用时强制转换结果 参数化函数并在调用它时指定对象类型(这将触发未选中的强制转换警告) 因此,我的问题是: 在选择这两种策略时,我需要考虑的是什么差异? 如果Java在运行时的每一点上的信息几乎相同,为什么我会通过参数化方法得到“uncheckedcast”警告 铸造: 公车{ 公共车辆新建(字符串symKey){ Svc Svc=新的Svc();

我有一个带有泛型函数的类,我希望对不同的对象类型重用它,以避免冗余代码

据我所见,在这种情况下有两种方法,即:

  • 在泛型函数中返回
    Object
    ,并在每次使用时强制转换结果
  • 参数化函数并在调用它时指定对象类型(这将触发未选中的强制转换警告) 因此,我的问题是:

    在选择这两种策略时,我需要考虑的是什么差异?<李>
  • 如果Java在运行时的每一点上的信息几乎相同,为什么我会通过参数化方法得到“uncheckedcast”警告 铸造:

    公车{
    公共车辆新建(字符串symKey){
    Svc Svc=新的Svc();
    Car Car=(Car)svc.getBySymKey(symKey);
    }
    }
    公共类Svc{
    公共对象getBySymKey(字符串symKey){
    返回DB.getBySymKey(symKey);
    }
    }
    
    参数化:

    公共接口ObjSvcIntf{
    E getBySymKey(字符串symKey);
    }   
    公共抽象类ObjSvcImpl实现了ObjSvcIntf{
    公共类servicedClass;
    //建造师
    public ObjSvcImpl(类servicedClass){
    this.servicedClass=servicedClass;
    }
    公共E getBySymKey(字符串symKey){
    返回(E)DB.getBySymKey(this.servicedClass,symKey);
    }
    }
    公共类驱动程序svc{
    公共类servicedClass;
    公共司机{
    this.servicedClass=Driver.class;
    }
    }
    公共类CarSvc{
    公共类servicedClass;
    公共车辆{
    this.servicedClass=Car.class;
    }
    公共驱动程序getDriver(字符串符号键){
    返回新的DriverSvc().getBySymKey(symKey);
    }
    }
    公共类数据库{
    公共静态E getBySymKey(类entityClass,字符串symKey)
    Query Query=DB.s.createQuery(“来自”+entityClass.getSimpleName()+”,其中symKey=:symKey);
    query.setParameter(“symKey”,symKey);
    返回(E)query.getResultList().get(0);
    }
    }
    
    编辑:


    在第二种情况下,带有表达式的新参数
    targetType
    是不可避免的吗?

    我可以问一下为什么不可以吗?什么是
    DB
    ?它的
    getBySymKey
    方法是否返回
    Object
    ?为了使它真正的类型安全(这样你根本不需要强制转换),你需要生成
    DB.getBySymKey(…)
    generic,以便返回适当的类型。很抱歉,我误读了您的代码。通常,泛型参数仅由一个字母组成,因此我们不会将它们与类名混淆。我认为您不需要执行
    Car Car=svc.getBySymKey(symKey)
    Car Car=svc.getBySymKey(symKey)
    应该可以工作,因为它可以推断类型您可能无法完全避免强制转换,但最好尽可能少地进行强制转换(强制转换意味着您有意告诉编译器跳过类型检查)。因此,最好在类
    DB
    中进行一次强制转换(带有警告)然后让它返回
    Object
    ,并在调用该方法的任何地方强制转换。