我的应用程序中有一个数据库表处理程序的接口。其中一种方法如下:
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;
}
}
我现在面临的问题是,当我更改为时,我收到一条错误消息,指出“方法不会覆盖其超类中的方法。
任何人都知道有没有办法解决这个问题?甚至有可能有这样的解决方案吗?
答案 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应该可以帮助您解决这个问题