【发布时间】:2013-10-16 09:09:03
【问题描述】:
抱歉,我事先对泛型的了解有限。
我有以下情况:
第 1 类:
public class PostProcess implements Serializable {
public int order;
// Several other variables.
// Constructor setting vars
public PostProcess(){
}
/* Getters and setters for variables */
}
第 2 类:
public class Application extends PostProcess{
public int subOrder;
// Several other variables.
// Constructor setting vars
public Application(){
}
/* Getters and setters for variables */
}
第 3 类:
public class FileOperation extends PostProcess{
public int subOrder;
// Several other variables (different from class 'Application').
// Constructor setting vars
public FileOperation(){
}
/* Getters and setters for variables */
}
我试图在不同的类中实现的是对包含定义为“FileOperation”和“Application”对象的列表进行排序:
private ArrayList<? extends PostProcess> processList = new ArrayList<PostProcess>();
这种排序必须在这两个对象的两个字段上,即:'order' 和 'subOrder'。 'order' 继承自 PostProcess,'subOrder' 定义在 'Application' 和 'FileOperation' 类中。
在我阅读泛型、可比较、比较器和接口的整个过程中,我认为我把事情搞混了。
我正在尝试使用以下方式应用排序:
Collections.sort(processList, new PostProcessComparator());
PostProcessComparator 定义为:
public class PostProcessComparator implements Comparator<? extends PostProcess> {
@Override
public int compare(Object p1, Object p2) {
int mainOrderCompare = p1.getOrder().compareTo(p2.getOrder());
if (mainOrderCompare != 0) {
return mainOrderCompare;
} else {
return p1.getSubOrder().compareTo(p2.getSubOrder());
}
}
}
问题:
我知道我的 Comparator(可能还有更多)是错误的,但我不知道具体在哪里。我是来学习的;)
- 我注意到定义“processList”列表不是正确的方法。当我尝试将 'FileOperation' 或 'Application' 对象添加到 List 时,编译器会以“找不到适合 add(Application) 的方法”(FileOperation 相同)打我耳光。我是否错误地假设我可以使用泛型来声明我的 processList 类型?应该是正确的,因为这两个类都将 PostProcess 作为它们的超类,对吧?
- 用类边界定义 PostProcessComparator 在我看来应该可行,因为我只希望能够比较具有 PostProcess 作为超类的对象(因此可以访问相同的方法)。
-
如何访问 Comparator 类中 p1 和 p2 的参数对象(因为我仍然需要为参数声明它们的类型:
@Override public int compare(<What to put here?> p1, <And here?> p2) { }
真心希望大家帮忙! 如果我有什么不清楚的地方,请告诉我并详细说明。
谢谢!
编辑
感谢 NickJ 和 Winzu,我对比较器和 ArrayList 定义进行了必要的更改。
- 我已将 subOrder 从 Application 和 FileOperation 移至父类(并使其受到保护)
-
将比较器的参数化重新定义为:
public class PostProcessComparator<T extends PostProcess> implements Comparator<T> 使用 Integer.compare(p1.getOrder(), p2.getOrder()) 进行初始比较器比较。
现在是最后的挑战(编译器警告) 调用时:
Collections.sort(processList, new PostProcessComparator());
我收到警告: - [unchecked] 未经检查的方法调用:类 Collections 中的方法排序应用于给定类型
required: List<T>,Comparator<? super T>
found: ArrayList<PostProcess>,PostProcessComparator
在我看来,这个比较器的参数化是正确的,除了我没有检查对象类型。
这哪里出错了?
【问题讨论】:
-
设计问题——为什么不将 subOrder 属性放在 PostProcess 类中,并使其受到保护,例如,派生类可以使用它?
-
@AlexAdas 这是个好主意。我还没有考虑过。让我试试看!谢谢
-
更新了我对您最后一个问题的回答
-
非常感谢 Winzu。完美的工作。现在很难选择正确的答案,因为它分为两部分。 +2 给你。非常感谢您的帮助。
标签: java generics inheritance collections comparator