检查方法是否在 Java 中被覆盖



我想实现一个比较我的接口的两个对象的方法 Task .因为Task上只有一个严格的偏序partialCompareTo应该返回null当且仅当两个对象不可时。

如果您对严格部分排序的概念感到困惑,请查看以下内容:https://en.wikipedia.org/wiki/Partially_ordered_set

动机:某些任务将具有必须在另一个任务之前或之后完成的约束。然后,这用于对任务进行拓扑排序,即以满足所有约束的方式排列它们。

对于任何Task ab实例,它应具有以下属性:

  • 如果是a.partialCompareTo(b) != null,则sgn(a.partialCompareTo(b)) = -sgn(b.partialCompareTo(a))
  • 如果a.partialCompareTo(b) = nullb.partialCompareTo(a) = null

注意:我不能使用标准库的接口Comparable,因为 Task:compareToComparable 返回int时不会有总排序,所以如果两个对象无法比较,则无法获得足够的结果。特别是会有 Task 的实现,其中该实现的实例永远不会相互比较(但可能与 Task 的其他子类的实例相当,这些子类覆盖了 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;
    }
}

有没有办法问,该方法是否在代码中被覆盖

或者有没有其他方法来解决我的问题?

当你比较东西时,你应该使用Duffymo推荐的具有类似界面的东西。为了详细说明,您应该将项目保留在 ArrayList 中,然后覆盖比较方法。我不确定你为什么有pCompare,但我假设你不了解继承和多态性。与其更改比较的名称,不如使用扩展,这里有关于继承的文档,请阅读它们。看起来你的语法很好,但你对java代码如何编写的理解并不好。那么你应该怎么做呢?

让我们从我认为错误的第一件事开始(如果这是不正确的,请随时纠正我)您没有正确使用界面。接口适用于声明全局变量、帮助您实现设计模式等。大多数人说这是一种行为契约。用简单的英语来说,使用界面来帮助您克服多重继承。我不知道你为什么要使用一个以及你打算用它做什么,但我从未向实现的接口添加方法。

接下来的事情是你重命名你的pCompareTo我从来没有这样做过,我帮助制作了一些相当大的程序。我真的不认为这是好的编程。 它应该在一个类中。使用它的类很好,尽管并非总是如此,我很难思考如何解释它,因此您可能需要做一些研究。

当你去掉接口时,把compareTo()放在正确的位置(不要把它改成pCompareTo(),这是糟糕的编程),你像你一样覆盖它,并指定进入它的内容。注意这一点很重要通常,当您覆盖比较时,您有 compareTo 方法,如果传入的对象小于要比较的对象,则返回 -1,如果它更大,则返回 1,如果大小相同,则返回 0。如果您只想检查它是否相等,那么您可以简单地检查它们是否相等,就像您所做的字符串一样

string1.equals(string2)
如果

为真,它将返回 1,如果为假,它将返回 0。

 @Override
public default Integer pCompareTo(Task other) {
    Integer result;
    try {
        result = - other.pCompareTo(this);
    } catch (StackOverflowError | NullPointerException e) {
        return null;
    }
    return null;
}
好吧,这是大错

特错的人,只是大错特错。你的方法是pCompareTo()对吧?你在它本身内部调用它(这称为递归,我不建议你现在使用它)。我不知道你在比较什么(这里也不需要 try catch,但如果你愿意,可以,try catch 就像你在代码中设置的陷阱,如果该特定区域无法正常工作,它会消失),但如果它们是整数,你会做类似的事情

@Override
public int compareTo(Integer other){
 if (this < other) {
  return 1;
 }
 if (this > other) {
  return -1;
 }
 return 0;

请参阅覆盖说明。在这篇已经很长的帖子中向您解释它是如何工作的,对我来说很重要。祝你好运,我在编程中的建议语法不是很重要。知道如何正确编程更为重要。

修订版稍微好一点,更有意义。谢谢你。现在要开始,您需要了解您正在比较对象。如果你想写一个compareTo()方法,你需要考虑"我在比较什么"。为了让你写出你的方法,你需要向我们解释你在比较什么,在你的脑海中,你可能正在比较一个集合中的元素。但是在编程世界中,您正在比较整数,字符串或w/e。所以我问你,你在比较什么?你应该做一个你正在比较的w/e类,比如说

class POsetElement{...
//make some sort of set element object
}

在此类中,您可能希望像这样实现可比较的,

class POsetElement implements comparable{...
//make some sort of set element object...
//then make w/e other methods you need...
//now use compareTo() override
@override
compareTo(){
//make your custom method
}
}

请注意我如何将 compareTo() 方法 PUT 在 POsetElement 类中。 Java 是 OOP。这意味着面向对象的编程。您需要自定义构建对象。你需要创造自己的世界,创造自己的对象。我无法向你解释这一切。请付出一些努力,学习更多的Java编程。你还需要明白,我会说这些是一些非常基本的东西,我会再次重申你需要阅读一些关于java基础知识的知识。祝你好运。

相关内容

  • 没有找到相关文章

最新更新