Java 离开<;E>;在ArrayList中由类决定
我的应用程序中有一个databasetable处理程序接口。其中一种方法如下所示: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
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方法主体中的代码使我想做的事情更加清晰。谢谢你做到了!:)谢谢你做到了!:)