在java中使用foreach循环时出现奇怪的错误
我正在做一个todolist的小程序,我发现了一个以前从未有过的奇怪bug。我有4个类:1个包含todo数据的POJO类:在java中使用foreach循环时出现奇怪的错误,java,arraylist,foreach,Java,Arraylist,Foreach,我正在做一个todolist的小程序,我发现了一个以前从未有过的奇怪bug。我有4个类:1个包含todo数据的POJO类: public class Todo implements Comparable { private String title; private String task; private boolean done; public Todo(String title, String task) { this.title = title; thi
public class Todo implements Comparable {
private String title;
private String task;
private boolean done;
public Todo(String title, String task) {
this.title = title;
this.task = task;
}
public String getTitle() {
return title;
}
public void setTitle(String newTitle) {
title = newTitle;
}
public String getTask() {
return task;
}
public void setTask(String newTask) {
task = newTask;
}
public boolean isDone() {
return done;
}
public void setDone(boolean isDone) {
done = isDone;
}
public int compareTo(Object obj) {
Todo todo = (Todo) obj;
return getTitle().compareTo(todo.getTitle());
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Todo {\n");
sb.append("Title: \"");
sb.append(getTitle() + "\";\n");
sb.append("Task: \"");
sb.append(getTask() + "\";\n");
sb.append("}");
return sb.toString();
}
}
然后我有一个类来存储和加载我的TODO:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class ListStorage {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
FileWriter writer;
BufferedReader reader;
public void storeList(List list, String filename) throws IOException {
String json = gson.toJson(list);
writer = new FileWriter(filename);
writer.write(json);
writer.close();
}
public List loadList(String filename) throws FileNotFoundException {
reader = new BufferedReader(new FileReader(filename));
List list = gson.fromJson(reader, List.class);
return list;
}
}
然后我有一个“经理”类,基本上就是我的控制器:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Manager {
private List<Todo> todos = new ArrayList<>();
private ListStorage storage = new ListStorage();
public List getTodos() {
return todos;
}
public void setTodos(List newTodos) {
todos = newTodos;
}
public ListStorage getStorage() {
return storage;
}
public void add(String title, String task) {
todos.add(new Todo(title, task));
sort();
try {
storage.storeList(todos, "todos");
} catch(Exception e) {
e.printStackTrace();
}
}
public void remove(int index) {
todos.remove(index);
sort();
try {
storage.storeList(todos, "todos");
} catch(Exception e) {
e.printStackTrace();
}
}
private void sort() {
Collections.sort(todos);
}
}
当我在CLITodo中删除
时,会出现以下错误:
CLITodo.java:13:19: error: incompatible types
for (Todo t : todos) {
^
required: Todo
found: Object
为什么会发生这种错误?我的Manager classes getTodos()-方法返回一个Todo类型的列表,但编译器告诉我它只是一个对象(当然是一个对象,但它也是一个集合,实际上应该可以工作)。
这是第一次发生此错误,我似乎真的找不到导致此错误的原因。当您不指定使用什么嵌套类型来反序列化JSON时,就像您在这里所做的那样
List list = gson.fromJson(reader, List.class); // All it knows is that the root json is a List
Gson使用LinkedTreeMap
你真正想要的是
List list = gson.fromJson(reader, new TypeToken<List<Todo>>(){}.getType());
List List=gson.fromJson(读取器,newTypeToken(){}.getType());
当您不指定使用什么嵌套类型来反序列化JSON时,就像您在这里所做的那样
List list = gson.fromJson(reader, List.class); // All it knows is that the root json is a List
Gson使用LinkedTreeMap
你真正想要的是
List list = gson.fromJson(reader, new TypeToken<List<Todo>>(){}.getType());
List List=gson.fromJson(读取器,newTypeToken(){}.getType());
我不确定这是否是您的真实代码man.gettoos()
返回一个List
,但您试图将其分配给List
…将gettoos()-方法类型更改为List也不起作用,如果这是您的意思,我不确定这是您的真实代码man.gettoos()
返回一个列表
,但您正试图将其分配给列表
…将gettoos()-方法类型更改为List也不起作用,如果您的意思是这样的话,那么这起作用了,并且列表被正确打印出来;非常感谢,先生@塞利姆:不客气。作为补充说明,不要使用原始类型。它们会引起各种各样的头痛。这是有效的,而且列表正在正确地打印出来;非常感谢,先生@塞利姆:不客气。作为补充说明,不要使用原始类型。它们会引起各种各样的头痛。