我已经为所有bean类实现了通用DAO。我在设置缓存中的条目时遇到了问题。
DAO.class
public abstract class DAO<T extends Serializable> extends Cache
{
save(Collection<T> list)
{
// batch process will store the list to db
for(T t : list)
{
cache(t.getKey(), t);
}
}
}
Bean的DAO类
public class BeanDAO1 extends DAO<Bean1>
{
public static set(Collection<Bean1> list)
{
super.save(list);
}
}
public class BeanDAO2 extends DAO<Bean2>
{
public static set(Collection<Bean2> list)
{
super.save(list);
}
}
现在的问题是,两个Bean类都有相同的getter方法getKey()
。但是在DAO类中,由于它是类型引用的,我无法访问该方法。
这是我做错了还是我应该做其他事情?
答案 0 :(得分:1)
在save
方法中,您可以在getKey()
类型的对象上访问方法T
。为此,您必须将该类型变量约束为具有此方法的类型的子类型。事实上,编译器唯一知道你的T
是Serializable
的子类型(它没有这种方法)。
这意味着你应该拥有所有bean的超类型:
public interface Bean extends Serializable {
public ? getKey(); // I do not know what type your keys are
}
您的bean类应该实现此接口。然后,您可以执行以下操作:
public abstract class DAO<T extends Bean> extends Cache {
public save(Collection<T> list) {
for(T t : list) {
cache(t.getKey(), t);
}
}
}
答案 1 :(得分:0)
您的类型声明T extends Serializable
过于宽泛。您必须定义一个实现的类或扩展Serializable
的接口,该接口具有抽象方法getKey()
,并让T
扩展此新类型。
答案 2 :(得分:0)
@Ray建议的最干净的解决方案是为实体类提供一个通用接口,例如:
public abstract class DAO<T extends AbstractEntity> extends Cache
{
save(Collection<T> list)
{
// batch process will store the list to db
for(T t : list)
{
cache(t.getKey(), t);
}
}
}
界面:
public interface AbstractEntity
{
}
修改强>
让 Bean1 和 Bean2 实现接口:
public class Bean1 implements AbstractEntity
{
}
public class Bean2 implements AbstractEntity
{
}
答案 3 :(得分:0)
标记接口Serializable
没有定义getKey()方法。但是,类型T
可以声明多个上限。让你的Bean1和Bean2扩展一个公共超类或接口有一个getKey()方法
interface Bean{
Object getKey();
}
class Bean1 implements Bean,Serializable {
public String getKey(){
///
}
}
class Bean2 implements Bean,Serializable{
public String getKey(){
///
}
}
public abstract class DAO<T extends Bean & Serializable> extends Cache
{
save(Collection<T> list)
{
// batch process will store the list to db
for(T t : list)
{
cache(t.getKey(), t);
}
}
}
public class BeanDAO1 extends DAO<Bean1>
{
public static set(Collection<Bean1> list)
{
super.save(list);
}
}
public class BeanDAO2 extends DAO<Bean2>
{
public static set(Collection<Bean2> list)
{
super.save(list);
}
}