为什么在compareTo(Object)中有一个强制转换

时间:2015-12-08 22:23:28

标签: java comparable

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;
    }
}

这是我为课程编程分配的代码。我不确定为什么我会使用Task other = (Task)x;或者它在这里做什么。其余的我明白了。如果有人能快速解释这里的实际行动,我会很高兴。谢谢!

2 个答案:

答案 0 :(得分:2)

您将Object x投射到Task other - ObjectTask是不同的类型,因此您需要投射,以便将x视为预期输入(并获取它的字段)。

通常在compareTo()中你会先盲目地投射if (x instanceof Task)之类的东西 - 如果你不这样做,那么类型会不同,那么事情会崩溃)

答案 1 :(得分:2)

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

就个人而言,我认为这是不好的做法,因为你不知道传递了什么类型的对象(任何类子类Object都可以传入)所以检查的实例不会更糟糕您希望遇到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;
    }
}