JavaFX:ObservableList,ClassCastException:A不能强制转换为B

JavaFX:ObservableList,ClassCastException:A不能强制转换为B,java,listview,javafx,Java,Listview,Javafx,我正在尝试用JavaFX创建GUI。我有一个列表视图,我想用来显示一些数据。我想使用两种可能的数据集,我们称之为汽车和自行车。当我按下相应的按钮时,我想加载我需要的数据。到目前为止,我的控制器类如下所示: import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.Scene; import javaf

我正在尝试用JavaFX创建GUI。我有一个列表视图,我想用来显示一些数据。我想使用两种可能的数据集,我们称之为汽车和自行车。当我按下相应的按钮时,我想加载我需要的数据。到目前为止,我的控制器类如下所示:

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.util.Callback;


import java.util.List;

public class FXMLController {
    @FXML
    ListView lv_list;
    @FXML
    Button button_cars;
    @FXML
    Button button_bikes;


    List<Cars> cList;
    List<Bikes> bList;
    Server serv;

    private ObservableList observableList = FXCollections.observableArrayList();

    public void initScene szene) {
        /* initializes serv so it properly yields data */
    }


    public void listAllCars() {
        cList = serv.getAllCars();
        updateCarList();
    }

    private void updateCarList() {
        observableList.setAll(cList);
        lv_list.setItems(observableList);
        lv_list.setCellFactory(new Callback<ListView<Cars>, ListCell<Cars>>() {
            @Override
            public ListCell<Cars> call(ListView<Cars> listView) {
                return new ListViewElemCars(); // creates stuff to populate the list
            }
        });
    }

    public void listAllBikes() {
        bList = serv.getAllBikes();
        updateBikeList();
    }

    private void updateBikeList() {
        observableList.setAll(bList);
        lv_list.setItems(observableList);
        lv_list.setCellFactory(new Callback<ListView<Bikes>, ListCell<Bikes>>() {
            @Override
            public ListCell<Bikes> call (ListView<Bikes> listView) {
                return new ListViewElemBikes(); //same as with cars
            }
        });
    }
}

我想这是由于updateCarList/updateBikeList方法中未经检查的调用造成的,但我在这里真的不知所措。我想用一个ListView来做这些事情,但我真的不明白这里出了什么问题。我在这里遗漏了什么?

您使用由
cellFactory返回的单元格中的具体类型。当新项目类型添加到不打算显示新类型项目的单元格中时,
列表视图将重用单元格,从而导致出现
ClassCastException

即使是以下方法似乎也不起作用:

  • 清除
    项目
    列表
  • 更换
    cellFactory
  • 调用
    refresh()
  • 添加新的
    项目

  • 这意味着您必须使用能够处理所有项目类型的单元格,或者通过替换整个
    列表视图

    可以发布有关异常来源行的更多信息吗?也许是几行完整的stacktrace?
    Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: Cars cannot be cast to Bikes