调用泛型类型实例方法

时间:2014-08-21 07:59:45

标签: java generics

我已经为所有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类中,由于它是类型引用的,我无法访问该方法。

这是我做错了还是我应该做其他事情?

4 个答案:

答案 0 :(得分:1)

save方法中,您可以在getKey()类型的对象上访问方法T。为此,您必须将该类型变量约束为具有此方法的类型的子类型。事实上,编译器唯一知道你的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);
        }
    }
}

答案 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);
    }
}