我在Java中有一个名为1.1.1.1
的父类。我有子课程:Flight
,JetFlight
等,它们继承自NormalFlight
。
我希望所有子类都从Flight
接口实现compareTo
。我希望它们继承自Comparable
,因为我想使用多态(例如,启动Flight
数组并用Flight
,JetFlight
等对象填充它。) 。
这是我的父类代码:
NormalFlight
这是其中一个子类的代码:
public abstract class Flight {
public abstract int compareTo(Object o);
}
由于2个错误,此代码无法编译:
1)public class JetFlight extends Flight implements Comparable<JetFlight> {
private int flightTime;
public JetFlight(int flightTime) {
this.flightTime = flightTime;
}
public int compareTo(JetFlight j) {
return this.flightTime - j.flightTime;
}
}
2)compareTo(T) in 'java.lang.Comparable' clashes with 'compareTo(Object)' in 'Flight'; both objects have the same erasure, yet neither overrides the other.
当我想从类继承并同时在子类上使用泛型时,我该如何处理这种情况?
答案 0 :(得分:2)
选项1:由于您的比较是基于飞行时间,据我所知,变量
flightTime
可以在父类中推送,因为所有航班都将具有此功能。然后在父类本身中实现compareTo()方法。
选项2:如果您希望保持当前代码的原样:
public abstract class Flight implements Comparable<Flight> {
public abstract int compareTo(Flight o);
}
public class JetFlight extends Flight {
private int flightTime;
public JetFlight(int flightTime) {
this.flightTime = flightTime;
}
public int compareTo(Flight f) {
if(!(f instanceof JetFlight)){
throw new IllegalArgumentException();
}
return this.flightTime - ((JetFlight)f).flightTime;
}
答案 1 :(得分:1)
您可以对Comparable
所限定的T
类型Flight
进行参数化设置:
abstract class Flight<T extends Flight<T>> implements Comparable<T> {
public abstract int compareTo(T o);
}
class JetFlight extends Flight<JetFlight> {
private int flightTime;
public JetFlight(int flightTime) {
this.flightTime = flightTime;
}
public int compareTo(JetFlight j) {
return this.flightTime - j.flightTime;
}
}
答案 2 :(得分:-1)
如果你使用泛型,你将摆脱这个问题。
您需要定义
public abstract int compareTo(JetFlight o);
并使用
public class JetFlight extends Flight implements Comparable<? extends JetFlight>