繁体   English   中英

调用泛型类型实例方法

[英]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()方法。 为此,必须将类型变量约束为具有此方法的类型的子类型。 就这样,编译器唯一知道您的TSerializable的子类型(没有此方法)。

这意味着您应该为所有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
{

}

编辑:

并让Bean1Bean2这样实现接口:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM