1

我已经标记了给我带来麻烦的行

private void EditButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           

DefaultListModel PatientListModel = new DefaultListModel();

for (Patient s : PatientList) {
    int AccNum = Integer.parseInt(IDTextField.getText());

    if (AccNum == s.getAccountNumber()) {

        s.setName(NameTextField.getText());
        s.setAge(Integer.parseInt(AgeTextField.getText()));
        s.setAddress(AddressTextField.getText());
        String PatientSex = "";

        if (MaleRadioButton.isSelected()) {
            PatientSex = "Male";
        }

        if (FemaleRadioButton.isSelected()) {
            PatientSex = "Female";
        }

        s.setSex(PatientSex);
        s.setPhone(PhoneTextField.getText());
        ArrayList<PatientCondition> PatientConditions3 = new ArrayList();
  ===>      PatientConditions3 = (ArrayList<PatientCondition>) ConditionsJList.getSelectedValuesList(); //error here
        s.setConditionsList(PatientConditions3);
        PatientInfoLabel2.setText("Patient Details Updated");

        for (Patient f : PatientList) {
            PatientListModel.addElement(f.getAccountNumber() + "-" + f.getName());
        }

        PatientJList.setModel(PatientListModel);
        UpdateAllViews();

        //       
    }
}
}                                 

错误是:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.Collections$EmptyList cannot be cast to java.util.ArrayList
4

6 回答 6

5

我认为错误消息非常有用。你不能做那个演员。

您应该将您的重新定义PatientConditions3为 type List<PatientCondition>。对接口List而不是特定实现进行编码是一种很好的做法,例如ArrayList. 此外,您应该重命名它以遵循 Java 命名约定:

List<PatientCondition> patientConditions3;

如果您需要将收到的转换List为例如一个ArrayList,您可以使用收到的元素创建一个新的List

patientConditions3 = new ArrayList<PatientCondition>(ConditionsJList.getSelectedValuesList());
于 2013-04-12T10:55:02.590 回答
1

Collections.emptyList()返回一个非法的List引用转换。ArrayList

尝试改变这个

ArrayList<PatientCondition> PatientConditions3 = new ArrayList();

对此

List<PatientCondition> PatientConditions3 = new ArrayList();
于 2013-04-12T10:55:30.797 回答
1

最有可能的是,该方法的方法声明ConditionsJList.getSelectedValuesList指定它返回一个List. 您不能指望该列表将成为ArrayList.

将变量的类型更改PatientConditions3List而不是ArrayList. 此外,如果您立即再次分配,则无需创建新的ArrayList并将其分配给;然后,您一无所有地创建它,它会立即被丢弃。PatientConditions3PatientConditions3ArrayList

List<PatientCondition> PatientConditions3 = ConditionsJList.getSelectedValuesList();

另一个说明:根据常见的 Java 编码约定,您不应该以大写字母开头的变量名。调用它patientConditions3而不是PatientConditions3. (这当然也适用于所有其他变量)。

于 2013-04-12T10:56:09.027 回答
0

如果List变量后面ArrayList实际上没有 a,则不能将其强制转换为 a。ArrayList在大多数情况下,您应该依赖接口来获取变量以实现最大的灵活性

List<PatientCondition> PatientConditions3 = ConditionsJList.getSelectedValuesList(); 

关于类型安全:只有在你确定转换的对象是目标类型的实例时才转换。instanceof在你施放之前检查一下。

于 2013-04-12T10:55:57.823 回答
0

当你在那里时,ConditionsJList.getSelectedValuesList();你会得到一些值的集合(或 List<>,如果这听起来更好)。你只需要将它们转换为PatientCondition..所以你应该有类似的东西: PatientConditions3 = (PatientCondition) ConditionsJList.getSelectedValuesList();

当然 PatientConditions3 必须是List<PatientCondition>...

于 2013-04-12T10:56:30.240 回答
0

如果它是一个 ArrayList,这会为你做一个演员,否则 ArrayList 是空的:

ArrayList<PatientCondition> patientConditions3 = (ConditionsJList.getSelectedValuesList() instanceof ArrayList<PatientCondition> ? ((ArrayList<PatientCondition>) ConditionsJList.getSelectedValuesList()) : new ArrayList<PatientCondition>());
于 2016-06-08T08:21:41.930 回答