我有一个带有泛型函数的类,我想将其重用于不同的Object类型,以避免冗余代码。
据我所知,在这种情况下有两种方法可以使用:
- 在通用函数中返回
Object
,每次使用时都会强制转换结果 - 参数化该函数并在我调用它时指定对象类型(这将触发未经检查的强制转换警告)。
因此,我的问题是:
- 选择任何一种策略时我需要考虑什么差异?
- 如果Java在运行时在每个点上具有的信息几乎相同,为什么我会通过参数化方法收到“未经检查的转换”警告?
铸造:
public class Car {
public Car createNew(String symKey) {
Svc svc = new Svc();
Car car = (Car) svc.getBySymKey(symKey);
}
}
public class Svc {
public Object getBySymKey(String symKey) {
return DB.getBySymKey(symKey);
}
}
参数化:
public interface ObjSvcIntf {
<E> E getBySymKey(String symKey);
}
public abstract class ObjSvcImpl implements ObjSvcIntf {
public Class<?> servicedClass;
// CONSTRUCTOR
public ObjSvcImpl (Class<?> servicedClass) {
this.servicedClass = servicedClass;
}
public <E> E getBySymKey(String symKey){
return (E) DB.getBySymKey(this.servicedClass,symKey);
}
}
public class DriverSvc {
public Class<?> servicedClass;
public DriverSvc () {
this.servicedClass = Driver.class;
}
}
public class CarSvc {
public Class<?> servicedClass;
public CarSvc () {
this.servicedClass = Car.class;
}
public Driver getDriver(String symKey) {
return new DriverSvc().<Driver>getBySymKey(symKey);
}
}
public class DB {
public static <E> E getBySymKey (Class<?> entityClass,String symKey)
Query query = DB.s.createQuery("from " + entityClass.getSimpleName() + " where symKey = : symKey);
query.setParameter("symKey",symKey);
return (E) query.getResultList().get(0);
}
}
编辑:
在第二种情况下,不可避免的是带有表达式targetType.cast(tmpObject)
的新参数targetType
吗?