我想实现一个方法来比较我的接口的两个对象Task
。由于只有严格的偏序,当且仅当两个对象不可比较时才应该返回。Task
partialCompareTo
null
如果您对严格偏序的概念感到困惑,请查看: https ://en.wikipedia.org/wiki/Partially_ordered_set
动机:有些任务会受到限制,即必须在另一项任务之前或之后完成。然后将其用于对任务进行拓扑排序,即以满足所有约束的方式排列它们。
Task
a
对于and的任何实例,它应该具有以下属性b
:
- 如果
a.partialCompareTo(b) != null
那么sgn(a.partialCompareTo(b)) = -sgn(b.partialCompareTo(a))
- 如果
a.partialCompareTo(b) = null
那么b.partialCompareTo(a) = null
注意:我不能使用标准库的接口,因为Task:在returnComparable
中没有总排序,所以如果两个对象是incomparable ,就没有足够的结果。特别是会有 Task 的实现,其中实现的实例永远不能相互比较(但可能与Task 的其他子类的实例相比较,这些实例覆盖)。compareTo
Comparable
int
partialCompareTo
这个想法是使用partialCompareTo
参数的方法,如果它覆盖了类中指定的方法Task
。
下面的方法实际上更像是一个玩笑而不是实际的尝试,因为每次比较两个不可比较的对象时,我们都会得到一个 StackOverflowError (它被捕获,但无论如何这是不可行的):
public class Task implements TopologicalComparable<Task> {
/*
* other code
*/
@Override
public Integer partialCompareTo(Task other) {
Integer result;
try {
result = - other.partialCompareTo(this);
} catch (StackOverflowError | NullPointerException e) {
return null;
}
return null;
}
}
以下实现显然更好,但它有一个缺点,即总是必须覆盖辅助方法overridesDefaultPartialCompareTo
:
public class Task implements TopologicalComparable<Task> {
/*
* other code
*/
@Override
public Integer partialCompareTo(Task other) {
if (other.overridesDefaultPCompareTo()) {
Integer revComp = other.overridesDefaultPartialCompareTo(this);
if (revComp != null) {
return - revComp;
}
}
return null;
}
public default boolean overridesDefaultPartialCompareTo() {
return false;
}
}
有没有办法问,方法是否在代码中被覆盖?
还是有其他方法可以解决我的问题?