编译生成以下错误:“错误:类型不兼容:推理变量 T 具有不兼容的等式约束 Todo,TodoCouchDB”

问题描述

我正在尝试通过编写一个小的待办事项列表控制台应用程序来学习 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 实例列表