检索通用类型的类实例,而无需将通用作为输入

问题描述 投票:0回答:1

我有课:

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 实现BaseDao {}我也在使用批注来生成SQL查询(由于各种原因,我无法...

java generics annotations
1个回答
0
投票

[不幸的是,由于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

© www.soinside.com 2019 - 2024. All rights reserved.