1

我在 Java 中有一个父类,称为Flight. 我有子类:JetFlight,NormalFlight等继承自Flight.

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

这是我的父类代码:

public abstract class Flight  {
    public abstract int compareTo(Object o);
}

这是其中一个子类的代码:

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 个错误,此代码无法编译:

1)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'

当我想从一个类继承并同时在子类上使用泛型时,我该如何处理?

4

3 回答 3

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;
}
于 2017-09-03T10:54:12.157 回答
1

您可以参数化一个由 限制Comparable的类型:TFlight

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;
    }
}
于 2017-11-11T11:30:52.457 回答
-2

如果您使用泛型,您将摆脱这个问题。

你需要定义

public abstract int compareTo(JetFlight o);

并且还使用

public class JetFlight extends Flight implements Comparable<? extends JetFlight>
于 2017-09-03T08:49:30.657 回答