将<e>保留在ArrayList中以供类决定</e>

时间:2013-10-01 07:02:51

标签: java android arraylist

我的应用程序中有一个数据库表处理程序的接口。其中一种方法如下:

void add(ArrayList<? extends BaseObject> object);

根据实现的类,我希望它有不同的元素。

例如,在我的一个课程中,我想要以下内容:

@Override
public void add(List<Category> object) {

}

班级看起来像这样:

public class Category_Handler extends SQLiteOpenHelper implements HandlerInterface{

}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}


@Override
public void add(ArrayList<Category> object) {
    //Preparing the database variables
    SQLiteDatabase db = this.getWritableDatabase();

    for(int i = 0; i > objects.size(); i++){
        //Getting the values for the Category
        String name     = objects.get(i).getName();
        int subCategory = objects.get(i).getSubCat();

        if (db != null) {
            ContentValues cv = new ContentValues();

            //Adding values
            cv.put(Category_DAO.KEY_CATEGORY_NAME, name);
            cv.put(Category_DAO.KEY_SUBCATEGORY_TO, subCategory);

            //Finnish the insertion
            db.insert(Category_DAO.TABLE_NAME, null, cv);

        }
    }
db.close();
}

@Override
public void remove(int id) {

}

@Override
public void edit(int id, ArrayList<Category> values) {

}

和类别看起来像这样

public class Category extends BaseObject{
private String name;
private int subCat;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getSubCat() {
    return subCat;
}

public void setSubCat(int subCat) {
    this.subCat = subCat;
}

}

我现在面临的问题是,当我更改为时,我收到一条错误消息,指出“方法不会覆盖其超类中的方法。

任何人都知道有没有办法解决这个问题?甚至有可能有这样的解决方案吗?

4 个答案:

答案 0 :(得分:4)

然后你需要绑定类型,你不能使用通配符吗?。

我们需要查看更多代码,但可能类似

class DatabaseTableHandler<E extends BaseObject>{

   public void add(List<E> object){}

 }

然后你可以做

class CategoryHandler extends DatabaseHandler<Category>{

      @Override
      public void add(List<Category> object) {}

}

但是如果这个方法做了它似乎正在做的事情(从列表中添加所有内容),签名应该是

      public void addAll(List<? extends E> object){}

这样您也可以接受List<SubCategory>。 java.util.Collection #addAll也是这样的。

答案 1 :(得分:2)

如何使用add方法的类型作为其参数的通用接口如下:

public interface DatabaseHandler<T extends BaseObject> {
    public void add(ArrayList<T> objects);
}

然后,每个类都可以实现所需的接口版本:

public class CategoryHandler implements DatabaseHandler<Category> {
    @Override
    public void add(ArrayList<Category> objects) {
        // stuff
    }
}

答案 2 :(得分:0)

如果需要限制子类中add的类型,则不能使用通配符。但我怀疑你实际上根本不需要使用任何类型的花哨泛型 - 为什么不只是让所有子类实现add(List<BaseObject> object)?如果add真的只是将内容添加到列表中,那么List<BaseObject>也可以正常工作,并且减少了麻烦。

答案 3 :(得分:-1)

BaseObject是一个抽象类,因此它具有您必须实现的抽象方法。请参阅BaseObject的API以查看您必须实现的抽象方法。您的IDE应该可以帮助您解决这个问题