如何在Java中推断泛型类的类?

时间:2014-09-27 02:23:16

标签: java generics

我无法理解如何调用通用实体服务。下面的代码有效,但我需要在每个bean上维护getEntityClass(),我认为这是完全多余的。

public abstract class BaseEntityBean<T extends BaseEntity> extends BaseBean {

    protected void loadEntity(Class<T> entityClass, Long entityId) { // entityClass same as T
        T entity=genericEntityService.getEntity(entityClass, entityId);
    }

不要更改genericEntityService.getEntity(Class, Long)的签名。

我想将loadEntity的签名更改为loadEntity(Long entityId)

如何在genericEntityService.getEntity(Class, Long)内拨打loadEntity(Long)来推断T中的实体类?

如果问题不清楚,请按照以下步骤进行:

public abstract class BaseEntityBean<T extends BaseEntity> extends BaseBean {

    protected void loadEntity(Long entityId) {
        T entity=genericEntityService.getEntity(T, entityId); // pseudo code
    }

当前解决方案

protected void loadEntity(Long entityId) {
    ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
    @SuppressWarnings("unchecked")
    Class<T> clazz = (Class<T>) (superclass).getActualTypeArguments()[0];
    T entity=genericEntityService.getEntity(clazz, entityId);
}

我对此感到高兴,因为它让我感到高兴。在路上,我将使实体服务类型友好,一切都应该很好地落实到位。

2 个答案:

答案 0 :(得分:0)

可以选择使用反射来完成此操作。 正如一些人所指出的那样,这会增加一些开销,所以明智地使用它。

protected final Class<T> getEntityClass() {
    ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
    Class<T> clazz = (Class<T>) (superclass).getActualTypeArguments()[0];
    return clazz;
}

答案 1 :(得分:0)

使用TypeTools

// From within the BaseEntityBean impl
Class<?> t = TypeResolver.resolveRawArgument(BaseEntityBean.class, getClass());

使用TypeTools和getClass().getGenericSuperclass方法之间的区别在于TypeTools将为您遍历完整的类型层次结构,即使它在层次结构中有多个层,在这种情况下也会完全解析T的值getClass().getGenericSuperclass失败了。有关更好的主意,请参阅Generic DAO示例。