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

gmol1639  于 2022-12-09  发布在  CouchDB
关注(0)|答案(1)|浏览(155)

我试图通过编写一个小的todo列表控制台应用程序来学习Java,该应用程序可以将todos保存到文件系统或CouchDB。不幸的是,我遇到了从CouchDB阅读todos的编译器问题(使用LightCouch库),完全不知道如何继续前进。
我有以下课程:

  • TodoTodoFilesystemTodoCouchDB
  • ListxListFilesystemListCouchDB

下面是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

当我在ListCouchDB类中将query(TodoCouchDB.class)更改为query(Todo.class)时,它实际上编译并正确地填充了我的列表;然而,该列表包含Todo项的数组,因此,如果我试图对列表中的项调用任何方法,它将错误地调用Todo超类上的方法,而不是TodoCouchDB子类上的方法。
抱歉,如果有足够的信息。在这里,但感谢任何人能够提供的任何输入。

1yjd4xko

1yjd4xko1#

您可以尝试使用泛型型别。
使用泛型定义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示例的列表

相关问题