如何使用泛型并从父类继承而不会导致名称冲突?

时间:2017-09-03 08:45:51

标签: java generics inheritance abstract name-clash

我在Java中有一个名为1.1.1.1的父类。我有子课程:FlightJetFlight等,它们继承自NormalFlight

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

这是我的父类代码:

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.

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

3 个答案:

答案 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>