我有课:
public abstract class BaseDaoImpl<T extends BaseModel> implements BaseDao<T> {
}
我还使用批注来生成SQL查询(由于各种原因,我无法使用诸如休眠之类的框架),例如@Table和@Column。>
我希望能够检索<T extends BaseModel>
.class
实例,而不必将T
作为方法的输入。
我想最简单的选择是创建一个方法:
public void set(Class<T> clazz){}
但是,如果可能的话,我想避免这种情况,以使我的代码尽可能地简化。这可能吗?
我有一个类:公共抽象类BaseDaoImpl
[不幸的是,由于type erasure,无法执行此操作:您必须强制您的类在运行时提供元信息。我会做这样的事情(来自大型真实项目的经过修改的摘录)。
public abstract class AbstractBaseDao<T extends BaseModel> implements BaseDao<T>{
public abstract Class<T> getType();
}
class ConcreteModel extends BaseModel {/*...*/}
class ConcreteDao extends AbstractBaseDao<ConcreteModel> {
@Override
public Class<ConcreteModel> getType() {
return ConcreteModel.class;
}
}
另一种方法是像这样定义自定义注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Type {
Class value();
}
interface BaseDao<T extends BaseModel> { }
@Type(ConcreteModel.class)
public class ConcreteDao implements BaseDao<ConcreteModel> { }
...并将其用于您的DAO的某些处理器中,但这将需要一些附加的基础结构代码来注册所有带注释的类。而且-再次-您不能限制type bounds within annotations。