我有一个列表,其中包含2个类型为Department
和Manager
s的对象。
我需要按Department
的字母顺序对列表进行排序。 Department
类实现Comparable<Department>
并使用方法compareTo
。但是我收到一条错误消息:
&#34;类型中的方法sort(List,Comparator) 集合不适用于参数(List,new 比较器(){})&#34;
public static List<?> getLst(String fileName)throws FileNotFoundException, IOException,ClassNotFoundException {
List<Object> lst = new LinkedList<>();
BufferedInputStream f;
try(ObjectInputStream i = new ObjectInputStream(f=new BufferedInputStream(new FileInputStream(fileName)))){
while (f.available()>0) {
lst.add(i.readObject());
}
Collections.sort(lst, new Comparator<Department>() {
@Override
public int compare(Department object1,Department object2) {
return object1.getDepName().compareTo(object2.getDepName());
}
});
}
return lst;
}
答案 0 :(得分:4)
您没有正确使用泛型。
List<T>
和Comparator<T>
您正在提供对象列表;但是部门的比较者。这根本行不通。
因此,解决此问题的一种方法是 - 首先更改列表以使用正确的泛型类型:
List<Department> departments = new ArrayList<>();
以后......添加(现在必要的)强制转换,以便将传入的“对象”添加到该部门列表中 - 如果它具有正确的类型!
Object fromStream = i.readObject();
if (fromStream instanceof Department) {
departments.add( (Department) fromStream);
} else {
// consider what to do with managers objects ...
(请注意:lst
是一个错误的名称;它表示没有,而且只有一个已保存的字符 会增加混淆。使用表达内容的名称背后的事情是关于;像departments
要明确:包含的内容,以及复数的部门)
更新:泛型提示您在此处遇到设计问题。如果您要对部门进行排序,那么包含部门的列表应不包含其他任何内容。
换句话说:这里真正的答案是不使用包含不同类型对象的一个列表,但要使用两个列表代替。
答案 1 :(得分:0)
将管理人员列入同一名单的设计听起来令人怀疑。你在为树小部件制作模型吗?有更好的方法...
无论如何,你可以做以下两件事之一: