Java 泛型DAO如何为所有不同的DAO实现返回相同的类型?
我正在为我的DataNucleus JDO DAO创建通用DAO。泛型DAO将执行get、update、delete、create操作和其他一些泛型操作,因此这些实现可以在更具体的DAO中扩展 是否有可能以某种方式扩展泛型DAO,并让它在例如按id获取对象时返回正确的类型Java 泛型DAO如何为所有不同的DAO实现返回相同的类型?,java,dao,jdo,datanucleus,genericdao,Java,Dao,Jdo,Datanucleus,Genericdao,我正在为我的DataNucleus JDO DAO创建通用DAO。泛型DAO将执行get、update、delete、create操作和其他一些泛型操作,因此这些实现可以在更具体的DAO中扩展 是否有可能以某种方式扩展泛型DAO,并让它在例如按id获取对象时返回正确的类型 User user = userDao.get(userId); // Is this possible when UserDao extends generic DAO ?? userDao should return us
User user = userDao.get(userId); // Is this possible when UserDao extends generic DAO ?? userDao should return user of type User instead of object.
是的,可以使用泛型执行此操作:
public abstract class Dao<T> {
public T get(String id) { ... }
...
}
public class UserDao extends Dao<User> {
...
}
UserDao userDao = new UserDao();
User user = userDao.get(userId); //Returns a User
根据您的需要,Dao可以是抽象基类,也可以是泛型接口,例如公共接口IDao{…}是的,可以使用泛型实现这一点:
public abstract class Dao<T> {
public T get(String id) { ... }
...
}
public class UserDao extends Dao<User> {
...
}
UserDao userDao = new UserDao();
User user = userDao.get(userId); //Returns a User
根据您的需要,Dao可以是一个抽象基类,也可以是一个通用接口,例如公共接口IDao{…}verdesmarald已经回答了您的部分问题。我想在verdesmarald的代码中添加一个重要的更改
你应该更喜欢组合而不是继承。UserDao应该有一个Dao,而不是从Dao扩展UserDao。这样,您的代码将不会绑定到单个实现,并且可以在单元测试期间模拟Dao 您的部分问题已由verdesmarald回答。我想在verdesmarald的代码中添加一个重要的更改
你应该更喜欢组合而不是继承。UserDao应该有一个Dao,而不是从Dao扩展UserDao。这样,您的代码将不会绑定到单个实现,并且可以在单元测试期间模拟Dao 哎哟,我完全没有注意到这个问题的标签是java而不是C,但两者都适用。我已经更新了我认为正确的java语法的答案,但是我已经生疏了,而且这台机器上没有任何java的东西要检查。如果我犯了语法错误,我道歉,我会在可能的时候纠正它们@与继承相比,你应该更喜欢组合。看我的答案。哎呀,我完全没有注意到这个问题的标签是java而不是C,但两者都适用。我已经更新了我认为正确的java语法的答案,但是我已经生疏了,而且这台机器上没有任何java的东西要检查。如果我犯了语法错误,我道歉,我会在可能的时候纠正它们@与继承相比,你应该更喜欢组合。看我的答案。你的意思是我应该通过构造函数将泛型dao添加到UserDao吗?还是我误解了你的意思?我不同意-泛型DAO通常是一个带有单个实现的接口。不涉及继承或组合。这个建议很好,但不是在这种情况下。@newbie,没错。UserDao应该有一个Dao实例变量和一个接受Dao类型参数的构造函数。类似地,每个XYZDao类都可以有一个将Dao作为参数的构造函数。在单元测试时,您可以传入Dao的子类,该子类通过打印消息并返回而不进行任何实际的数据库操作来模拟数据库调用。您遗漏的一点是,不需要扩展通用Dao来创建用户Dao。您只需实例化一个参数化类型设置为User的实例。上面带有扩展名的代码不正确。@duffymo。有道理。若并没有必要延长刀,那个么我站在纠正。在这种情况下,上下文很重要!我的错!您的意思是我应该通过构造函数将泛型dao添加到UserDao吗?还是我误解了你的意思?我不同意-泛型DAO通常是一个带有单个实现的接口。不涉及继承或组合。这个建议很好,但不是在这种情况下。@newbie,没错。UserDao应该有一个Dao实例变量和一个接受Dao类型参数的构造函数。类似地,每个XYZDao类都可以有一个将Dao作为参数的构造函数。在单元测试时,您可以传入Dao的子类,该子类通过打印消息并返回而不进行任何实际的数据库操作来模拟数据库调用。您遗漏的一点是,不需要扩展通用Dao来创建用户Dao。您只需实例化一个参数化类型设置为User的实例。上面带有扩展名的代码不正确。@duffymo。有道理。若并没有必要延长刀,那个么我站在纠正。在这种情况下,上下文很重要!我的错!