Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用foreach循环时出现奇怪的错误_Java_Arraylist_Foreach - Fatal编程技术网

在java中使用foreach循环时出现奇怪的错误

在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

我正在做一个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;
    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也不起作用,如果您的意思是这样的话,那么这起作用了,并且列表被正确打印出来;非常感谢,先生@塞利姆:不客气。作为补充说明,不要使用原始类型。它们会引起各种各样的头痛。这是有效的,而且列表正在正确地打印出来;非常感谢,先生@塞利姆:不客气。作为补充说明,不要使用原始类型。它们会引起各种各样的头痛。