问题描述
我正在尝试通过编写一个小的待办事项列表控制台应用程序来学习 Java,该应用程序可以将待办事项保存到文件系统或 CouchDB。不幸的是,我遇到了从 CouchDB(使用 LightCouch 库)读取待办事项的编译器问题,并且完全不知道如何继续。
我有以下课程:
这是ListCouchDB
的内容:
public class ListCouchDB extends Listx {
public void load() {
CouchDbClient dbClient = new CouchDbClient();
list = dbClient.view("_all_docs").includeDocs(true).query(TodoCouchDB.class);
}
}
list
变量是定义在超类上的实例变量:
public class Listx {
public List<Todo> list = new ArrayList<Todo>();
...
}
ListCouchDB.java:12: error: incompatible types: inference variable T has incompatible equality constraints Todo,TodoCouchDB
list = dbClient.view("_all_docs").includeDocs(true).query(TodoCouchDB.class);
^
where T is a type-variable:
T extends Object declared in method <T>query(Class<T>)
1 error
当我在 query(TodoCouchDB.class)
类中将 query(Todo.class)
更改为 ListCouchDB
时,它实际上会编译并正确填充我的列表;但是,该列表包含一个 Todo
项数组,因此如果我尝试对列表中的项调用任何方法,它会错误地调用 Todo
超类上的方法而不是 TodoCouchDB
子类。
如果信息不足,请见谅。在这里,但感谢任何人能够提供的任何意见。
解决方法
您可以尝试使用泛型。
使用泛型定义你的 Listx
public class Listx<T extends Todo> {
public List<T> list = new ArrayList<T>();
...
}
将 ListCouchDB 定义为 Listx<TodoCouchDB>
的扩展
public class ListCouchDB extends Listx<TodoCouchDB> {
public void load() {
CouchDbClient dbClient = new CouchDbClient();
list = dbClient.view("_all_docs").includeDocs(true).query(TodoCouchDB.class);
}
}
现在,您的 list
属性是一个 TodoCouchDB 实例列表