0

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

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

4 回答 4

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 也可以这样工作。

于 2013-10-01T07:08:08.703 回答
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
    }
}
于 2013-10-01T07:12:02.287 回答
0

如果需要限制add子类中的类型,则不能使用通配符。但我怀疑您实际上根本不需要在这种情况下使用任何花哨的泛型——为什么不让所有子类都实现add(List<BaseObject> object)呢?如果add真的只是将东西添加到列表中,那么List<BaseObject>效果也一样好,而且麻烦更少。

于 2013-10-01T07:14:43.690 回答
-1

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

于 2013-10-01T07:10:03.010 回答