如何使用generics并从父类inheritance而不会导致名称冲突?
我在Java中有一个名为Flight
的父类。 我有子类: JetFlight
, NormalFlight
等inheritance自Flight
。
我希望所有子类都从Comparable
接口实现compareTo
。 我希望它们从Flight
inheritance,因为我想使用多态(例如,启动一个Flight
数组并用JetFlight
, NormalFlight
等对象填充它)。
这是我父类的代码:
public abstract class Flight { public abstract int compareTo(Object o); }
这是其中一个子类的代码:
public class JetFlight extends Flight implements Comparable { private int flightTime; public JetFlight(int flightTime) { this.flightTime = flightTime; } public int compareTo(JetFlight j) { return this.flightTime - j.flightTime; } }
由于2个错误,此代码将无法编译:
1) compareTo(T) in 'java.lang.Comparable' clashes with 'compareTo(Object)' in 'Flight'; both objects have the same erasure, yet neither overrides the other.
compareTo(T) in 'java.lang.Comparable' clashes with 'compareTo(Object)' in 'Flight'; both objects have the same erasure, yet neither overrides the other.
2) Class 'JetFlight' must either be declared abstract or implement abstract method 'compareTo(Object)' in 'Flight'
当我想从一个类inheritance并同时在子类上使用generics时,我该如何处理这种情况?
选项1:由于您的比较是基于飞行时间,据我所知,变量flightTime
可以在父类中推高,因为所有航class都具有此function。 然后在父类本身中实现compareTo()方法。
选项2:如果您想保持当前代码的方式:
public abstract class Flight implements Comparable { 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; }
您可以在由Flight
限制的T
类型上参数化Comparable
:
abstract class Flight> implements Comparable { public abstract int compareTo(T o); } class JetFlight extends Flight { private int flightTime; public JetFlight(int flightTime) { this.flightTime = flightTime; } public int compareTo(JetFlight j) { return this.flightTime - j.flightTime; } }
如果你使用generics,你将摆脱这个问题。
你需要定义
public abstract int compareTo(JetFlight o);
并且还使用
public class JetFlight extends Flight implements Comparable extends JetFlight>