为什么要在 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
- Object
和 Task
是不同的类型,因此您需要进行转换,以便可以将 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;
}
}
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
- Object
和 Task
是不同的类型,因此您需要进行转换,以便可以将 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;
}
}