java - 使用泛型类作为 java List 的类型

标签 java generic-programming generic-list

我想创建以下方法:

    @Override
public List<?> listerUser( Class<?> nomClass ) throws GestionExceptionsDAO {

    Object tableSQL;

    try {
       tableSQL = nomClass.newInstance();
    } catch ( InstantiationException e1 ) {
        e1.printStackTrace();
    } catch ( IllegalAccessException e1 ) {
        e1.printStackTrace();
    }

    List<tableSQL> listeUser;//Error : tableSQL cannot be resolved to a type

    Session session = sessionFactory.openSession();
    session.beginTransaction();
    Query requete = session.createQuery( REQUETE_LIST );
    requete.setParameter( REQUETE_LIST, tableSQL );

    try {
        listeUser = (List<tableSQL>) requete.getResultList();
    } catch ( NoResultException e ) {
        throw null;
    } catch ( Exception e ) {
        throw new GestionExceptionsDAO( e );
    } finally {
        session.close();
    }
    return listeUser;
}

我尝试做的是创建一个方法,该方法接受类名参数,并返回该类的对象列表。我认为这很简单,但我发现做起来有些困难。非常感谢。

最佳答案

您不能使用对实例变量的引用来参数化泛型类型。

您可能正在寻找的习惯用法是通用方法,它返回 List使用给定 Class 的类型进行参数化论据:

public <T>List<T> listerUser(Class<T> nomClass) {
    List<T> result = new ArrayList<>();
    // TODO populate the result based on your query 
    return result;
}

您还可以绑定(bind)T通过使用 extends 到给定类/接口(interface)(包括上限/下限)的子级或父级或super关键词。

例如,给定定义:

public <T extends CharSequence>List<T> listerUser( Class<T> nomClass )

调用可以是:

List<String> list = listerUser(String.class);

注释

  • 有关泛型方法的文档 here
  • 如果您计划使用反射来初始化 T 的新实例(例如 T t = nomClass.newInstance(); ),您需要抛出或处理 IllegalAccessExceptionInstantiationException

关于java - 使用泛型类作为 java List 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40738622/

相关文章:

c# - Java 到 C# Unix 时间转换

java - 无效申请。删除?在诺基亚手机上

c++ - 在 C++ 中使用模板而不是桥接模式

C# 数组与泛型列表

java - 在 Java 中 File.canExecute() 究竟做了什么?

java - 如何加密/解密blueprint.xml中的密码?

c - C 编程中的 pragmapack() 除了结构打包之外还有其他用途吗?

java - 如何获取作为通用参数传递给 Java 函数的实体的字段?

java - 方法不适用于泛型方法参数

c# - 为什么不允许 Array.Count 作为自己的索引值?