java - 如何在方法中使用类的泛型

标签 java spring hibernate generics

我有一个采用泛型的抽象类,在这个类中有一些方法。

我的问题是我不能在方法内部使用泛型 E。

public abstract class AbstractRepository<E> implements Repository<E> {

    final Class<E> typeParameterClass;

    public AbstractRepository(Class<E> typeParameterClass) {
        this.typeParameterClass = typeParameterClass;
    }

    ...

    @Override
    public E findById(Integer id) {
        try {
            this.entityManager.find(typeParameterClass, id);

        } catch (IllegalArgumentException error) {
            error.printStackTrace();

        } catch (PersistenceException error) {
            error.printStackTrace();
        }
        return null;
    }

我尝试使用泛型 E 作为“find()”的参数,如下所示,但我收到一条错误消息,指出 E 未定义。

@Override
public E findById(Integer id) {
    try {
        this.entityManager.find(E, id);

    } catch (IllegalArgumentException error) {
        error.printStackTrace();

    } catch (PersistenceException error) {
        error.printStackTrace();
    }
    return null;
}

为了解决这个问题,我使用了 typeParameterClass。

typeParameterClass 是扩展 AbstractRepository 的每个其他类都必须传递的参数,这个参数是类本身,但它似乎不正确,因为我已经有了泛型类。

现在的例子:

@Repository
public class UserRepository extends AbstractRepository<User> {

    public UserRepository(){
        super(User.class);
    }

    ...
}

那么,有没有办法在方法内部使用泛型 E?

Repository 是一个也采用通用 E 的接口(interface)。

我将 Spring 与 Hibernate 结合使用。

最佳答案

Java 在运行时不存在泛型类型信息,因此无法确定用于具体实例的类型参数。

所以处理这个问题的唯一方法是通过 Class参数,就像您所做的那样,因为这些设计用于在运行时携带类型信息,并具有自引用通用参数,这就是为什么您可以确保使用的类类型属于您的类型 E通过将其声明为 Class<E> .同样,所有泛型类型参数都只是编译器的糖分,并在运行时被删除(因此它们只能确保没有人编写传递实例中非 E 类的代码)。

关于java - 如何在方法中使用类的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40152632/

相关文章:

java - MySQL,从已解析文件加载数据的最有效方式

html - 在 Thymeleaf 中创建下拉菜单和表单

java - 获取 Java 类加载引用层次结构

java - Spring Security 中的链式身份验证

Hibernate - 在 pojo 中声明 Transient 对象

performance - 是否优化了Hibernate命名的HQL查询(在批注中)?

java - MSSQL 和 Hibernate 的 ID 跳转问题

java - 如何使用持久层对好友系统进行建模?

java - 当数组有奇数时如何使用二分查找?

java - Spring MVC JSP 参数