[英]Call generic type instance method
我已经为我所有的bean类实现了Generic 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类中,由于它是类型引用的,所以我无法访问该方法。
是我做错了还是应该做其他事情?
在您的save
方法中,您将访问类型T
对象的getKey()
方法。 为此,必须将类型变量约束为具有此方法的类型的子类型。 就这样,编译器唯一知道您的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);
}
}
}
类型声明T extends Serializable
范围太广。 您必须定义一个具有抽象方法getKey()
实现或可扩展Serializable
的接口,并让T
扩展此新类型。
@Ray建议的最干净的解决方案是为Entity类提供一个通用接口,例如:
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
{
}
标记接口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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.