为什么要在 compareTo(Object) 中进行转换

Why have a cast in a compareTo(Object)

public int compareTo(Object x) {
    Task other = (Task)x;

    if (other.priority == this.priority) {
        System.out.println("Each task has the same priority level.");
        return 0;
    } else if (other.priority > this.priority) {
        System.out.println(other.priority + "\n" + this.priority);
        return -1;
    } else {
        System.out.println(this.priority + "\n" + other.priority);
        return 1;
    }
}

这是我为 class 编写的编程作业代码。我不确定我为什么使用 Task other = (Task)x; 或者它在这里做什么。其余的我明白了。如果有人能快速解释这里的实际情况,我将不胜感激。谢谢!

您正在将 Object x 转换为 Task other - ObjectTask 是不同的类型,因此您需要进行转换,以便可以将 x 视为预期的类型(并到达它的字段)。

通常在 compareTo() 中,你会先得到类似 if (x instanceof Task) 的东西,然后再盲目投射它——如果你不这样做,并且类型不同,那么事情就会崩溃)

方法签名采用 Object 类型对象,因此为了在传入的对象中引用变量 priority,它必须对 Task 对象进行强制转换,如下所示该变量仅存在于 Task class.

但就个人而言,我认为这是一种不好的做法,因为您不知道传入的是哪种对象(任何 class subclassing Object 都可以传递in) 因此检查实例不会出错,除非您想 运行 进入 ClassCastException 的 运行 时间错误。

或者,您可以使用 generics 指定要比较的对象类型。所以与其这样做...

public class Task implements Comparable {
    private int priority = 1;

    @Override
    public int compareTo(Object o) {
        if (o instanceof Task) {
            Task t = (Task) o;
            return this.priority < t.priority;
        }

        return -1;
    }
}

...你可以这样做...

public class Task implements Comparable<Task> {
    private int priority = 1;

    @Override
    public int compareTo(Task t) {
        return this.priority < t.priority;
    }
}