如何使用generics并从父类inheritance而不会导致名称冲突?

我在Java中有一个名为Flight的父类。 我有子类: JetFlightNormalFlight等inheritance自Flight

我希望所有子类都从Comparable接口实现compareTo 。 我希望它们从Flightinheritance,因为我想使用多态(例如,启动一个Flight数组并用JetFlightNormalFlight等对象填充它)。

这是我父类的代码:

 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