Java 离开<;E>;在ArrayList中由类决定

Java 离开<;E>;在ArrayList中由类决定,java,android,arraylist,Java,Android,Arraylist,我的应用程序中有一个databasetable处理程序接口。其中一种方法如下所示: void add(ArrayList<? extends BaseObject> object); public class Category_Handler extends SQLiteOpenHelper implements HandlerInterface{ } @Override public void onCreate(SQLiteDatabase db) { } @Overri

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

void add(ArrayList<? extends BaseObject> 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) {

}
}

我现在面临的问题是,当我更改为时,我会收到一条错误消息,说“方法不会从其超类重写方法”


有人知道是否有办法解决这个问题吗?甚至有可能有这样的解决方案吗?

那么您需要绑定类型,不能使用通配符

我们需要看到更多的代码,但可能类似于

class DatabaseTableHandler<E extends BaseObject>{

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

 }
类DatabaseTableHandler{
公共无效添加(列表对象){}
}
然后你就可以做了

class CategoryHandler extends DatabaseHandler<Category>{

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

}
class CategoryHandler扩展了DatabaseHandler{
@凌驾
公共无效添加(列表对象){}
}
但是如果这个方法做了它看起来要做的事情(从列表中添加所有内容),那么签名应该是

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

public void addAll(List那么您需要绑定类型,不能使用通配符

我们需要看到更多的代码,但可能类似于

class DatabaseTableHandler<E extends BaseObject>{

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

 }
类DatabaseTableHandler{
公共无效添加(列表对象){}
}
然后你就可以做了

class CategoryHandler extends DatabaseHandler<Category>{

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

}
class CategoryHandler扩展了DatabaseHandler{
@凌驾
公共无效添加(列表对象){}
}
但是如果这个方法做了它看起来要做的事情(从列表中添加所有内容),那么签名应该是

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

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

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

public interface DatabaseHandler<T extends BaseObject> {
    public void add(ArrayList<T> objects);
}
公共接口数据库处理程序{
公共void添加(ArrayList对象);
}
然后,您的每个类都可以实现所需的接口版本:

public class CategoryHandler implements DatabaseHandler<Category> {
    @Override
    public void add(ArrayList<Category> objects) {
        // stuff
    }
}
公共类CategoryHandler实现DatabaseHandler{
@凌驾
公共void添加(ArrayList对象){
//东西
}
}

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

public interface DatabaseHandler<T extends BaseObject> {
    public void add(ArrayList<T> objects);
}
公共接口数据库处理程序{
公共void添加(ArrayList对象);
}
然后,您的每个类都可以实现所需的接口版本:

public class CategoryHandler implements DatabaseHandler<Category> {
    @Override
    public void add(ArrayList<Category> objects) {
        // stuff
    }
}
公共类CategoryHandler实现DatabaseHandler{
@凌驾
公共void添加(ArrayList对象){
//东西
}
}

如果需要在子类中限制
add
的类型,则不能使用通配符。但我怀疑,在这种情况下,实际上根本不需要使用任何花哨的泛型——为什么不让所有子类实现
add(列表对象)
?如果
add
真的只是在列表中添加了一些东西,那么
list
也同样有效,并且带来的麻烦更少。

如果你需要在子类中限制
add
的类型,你就不能使用通配符。但是我怀疑你实际上根本不需要在这种情况下使用任何花哨的泛型——为什么不呢只需让所有子类实现
add(列表对象)
?如果
add
真的只是在列表中添加了一些东西,那么
list
也同样有效,而且麻烦更少。

问题是他可能不想要任何旧的BaseObject,而只想要更具体的类别。
list
不是
list
的子类型,所以不会work@Heuster是,但您可以添加
Category
实例到
列表
(你不能依赖你提取的项目是
类别
对象。)@Thilo我假设如果该方法被称为“add”“OP只是希望能够添加类型为
Category
的元素。如果是这样的话,那么您可以将
Category
实例添加到
BaseObject
的列表中。这很好。@jacobm:但情况正好相反:从列表中提取内容。(这是OP添加一些代码后的新信息)。问题是,他可能不想要任何旧的BaseObject,而只想要更具体的类别。
List
不是
List
的子类型,所以不会work@Heuster是的,但是您可以将
类别
实例添加到
列表
(您不能依赖提取的项目是
类别
对象。)@因此,我假设如果该方法被称为“add”,那么OP只希望能够添加
Category
类型的元素。如果是这种情况,那么您可以将
Category
实例添加到
BaseObject
的列表中。这很好。@jacobm:相反:从列表中提取内容。(这是OP添加一些代码后的新信息)。因此,您的
处理程序
接口需要绑定泛型类型:
接口处理程序
。它无法修复:S我在add方法体中添加了我的代码,以便更清楚地说明我要执行的操作。因此您的
处理程序
接口需要绑定泛型类型:
接口处理程序
。它无法修复:S我添加的我在add方法主体中的代码使我想做的事情更加清晰。谢谢你做到了!:)谢谢你做到了!:)