Java 和泛型

标签 java generics

我是 Java 的新手,如果我的理解完全错误,我深表歉意。

我正在尝试编写一个通用的(在英语意义上!)数据访问类。 例如我目前有:

public class DA<T> {
public static Dao getAccountDao() throws NamingException, SQLException {
    Context ctx = new InitialContext();
    DataSource dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/test");
    ConnectionSource connectionSource = new DataSourceConnectionSource(dataSource, new MysqlDatabaseType());            
    Dao<Account, Integer> accountDao =  DaoManager.createDao(connectionSource, Account.class);
    return accountDao;
}
}

我可以这样调用它:

Dao<Account, Integer> accountDao = DA.getAccountDao();

但我需要为每个 Dao/模型准备一个版本。所以我正在尝试做一些可以这样称呼的东西:

Dao<SomeClass, Integer> someClassDao = DA.getDao(SomeClass);

这可能吗?

我试过这样的事情:

public class DA {
public static Dao getDao(<T>) throws NamingException, SQLException {
    Context ctx = new InitialContext();
    DataSource dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/test");
    ConnectionSource connectionSource = new DataSourceConnectionSource(dataSource, new MysqlDatabaseType());            
    Dao<T, Integer> accountDao =  DaoManager.createDao(connectionSource, T.class);
    return accountDao;
}

但 Netbeans 给出了错误:illegal start of type

我的大脑正在与泛型作斗争,这是他们可以做的事情吗?!

编辑:在下面帖子的帮助下,我必须:

public class DA<T> {
public static Dao<T, Integer> getDao(T daoType) throws NamingException, SQLException {
    Dao<T, Integer> accountDao =  DaoManager.createDao(T.class);
    return accountDao;
}

这会产生两个错误: 不能从静态上下文中引用非静态类型变量 T 如果我删除 static 关键字,我会得到: 无法从类型变量中选择 我需要阅读泛型和静态如何一起工作,但第二个看起来像是删除的结果(http://www.coderanch.com/t/386358/java/java/Converting-type-parameters-class),所以不确定是否可行。

早该提过,Dao 的东西使用了一个叫做 ORMLite 的 ORM 库,所以 createDao 等不是我的代码。

最佳答案

要访问T.class 的含义,您必须将类对象传递到方法中:

class Account {}

class Dao<TEntity, TId> {}

class DA {
    // your DaoManager.createDao() will also need a similar signature
    public static <TEntity> Dao<TEntity, Integer> getDao(Class<TEntity> daoType) {
        /// yadda blah, create DAO as appropriate
        return new Dao<TEntity, Integer>();
    }
}

public class Test {
    public static void main(String[] args) {
        // Pass the class literal for what you want TEntity to be as a parameter
        Dao<Account, Integer> dao = DA.getDao(Account.class);
    }
}

关于Java 和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088087/

相关文章:

C# 将 List<ObjBase> 转换为 List<Obj>

c++-cli - 如何在 C++/CLI 中检查泛型类型?

java - 如何读取通用列表中的 JSON

Java Graphics - 当我点击 -> all before works 时,repaint() 不起作用

java - JMockit 模拟构造函数

java - 如果使用 jar,则从 jar 中解压文件,然后将提取的文件复制到目录中

java - 如何在排序结束时始终有空值

Java:如何检查计算机是否已经被更改

c# - 在泛型集合之间转换

.net - 当 Type 为 TimeSpan 时尝试解析通用类型时出错