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