Java 为什么要在compareTo(对象)中进行强制转换

Java 为什么要在compareTo(对象)中进行强制转换,java,comparable,Java,Comparable,这是我在课堂上编程作业的代码。我不知道为什么我使用Task other=(Task)x或者它在这里做什么。其余的我都明白。如果有人能快速解释一下这到底是怎么回事,我会非常感激的。谢谢大家! 您正在将Object x强制转换为Task other-Object和Task是不同的类型,因此您需要强制转换,以便将x视为预期类型(并访问其字段) 通常在compareTo()中,您首先会得到类似于if(任务的x实例)的内容在盲目强制转换之前-如果你不这样做,并且类型不同,那么事情就会崩溃)方法签名采用对象

这是我在课堂上编程作业的代码。我不知道为什么我使用
Task other=(Task)x或者它在这里做什么。其余的我都明白。如果有人能快速解释一下这到底是怎么回事,我会非常感激的。谢谢大家!

您正在将
Object x
强制转换为
Task other
-
Object
Task
是不同的类型,因此您需要强制转换,以便将
x
视为预期类型(并访问其字段)


通常在
compareTo()
中,您首先会得到类似于
if(任务的x实例)的内容
在盲目强制转换之前-如果你不这样做,并且类型不同,那么事情就会崩溃)

方法签名采用
对象
类型对象,以便引用传入对象中的变量
优先级
,它必须对
任务
对象执行强制转换,因为变量仅存在于
任务
类中

但就我个人而言,我认为这是一种糟糕的做法,因为您不知道传入的是什么类型的对象(可以传入任何类子类化
object
),所以检查实例不会出错,除非您希望遇到ClassCastException的运行时错误

或者,您可以使用来指定要与哪种类型的对象进行比较。所以与其这样做

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;
    }
}
公共类任务实现可比较{
私有int优先级=1;
@凌驾
公共整数比较对象(对象o){
如果(o任务实例){
任务t=(任务)o;
返回this.priority
…你可以这样做

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;
    }
}
公共类任务实现可比较{
私有int优先级=1;
@凌驾
公共整数比较(任务t){
返回this.priority
。。。因为这不会发生,所以如果你比较一个任务和一个字符串,就会出现严重错误。@SarahDiri:如果这个答案对你有帮助,请接受:)我能把
对象x
改成更具体的东西吗(在这种情况下,
任务x
可能)?课程本身给我的印象是,这只是“如何完成”。@SarahDiri将
x
Object
更改为
Task
的唯一两种方法是执行强制转换(您已经在执行)或更改方法参数,使其仅允许
Task
对象作为参数传入。Java通过使用泛型实现了这一点(因此
实现了Comparable
而不是
实现了Comparable
)。使用此选项只允许传入
任务
对象。另请参见您是否正在实现
可比
或其他接口?如果是这样的话,就值得添加类声明。
public class Task implements Comparable<Task> {
    private int priority = 1;

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