Java:填充了接口元素的数据结构 - 如何强制实现接口的类实现compareTo()?

时间:2017-06-16 21:22:54

标签: java inheritance

我有一个名为 Bicycle 的内置界面(我不允许在其中添加或更改任何内容),

我创建了一个充满自行车元素的数据结构。

我需要自行车元素能够以不同的方式进行排序,决定它们在数据结构中的排序方式必须在实现接口Bicycle的类上。 (或任何其他不必在Bicycle界面进行任何更改的方式)

我在网上看到我需要写这样的东西:

Public class BicycleDataStructure <Bicycle extends Comparable<Bicycle>>

然后我可以在数据结构中的Bicycle元素上使用 compareTo()函数。但是,当我创建一个类:

SportBicycle implements Bicycle

Java并没有告诉我我需要添加 compareTo()函数的实现,那么它将如何知道通过哪个参数进行比较呢?我想我做错了什么.. 谢谢您的帮助。

编辑:代码 -

public class BicycleDataStructure<T extends Comparable<Bicycle>> {
protected List<Bicycle> dataStructure;
protected Bicycle max;

public BicycleDataStructure() {
    this.dataStructure= new ArrayList<>();
    this.max = null;

}

public void addBicycle(Bicycle b1) {
    int i;
    for (i = 0; i < dataStructure.size(); i++) {
        Bicycle b = dataStructure.get(i);

        if (b1.compareTo(b) < 0) {
            this.dataStructure.add(i, b1);
            break;
        }

    }

}

和界面 -

public interface Bicycle{

public int getModel();

public String getColor();

public String getBrand();

public int getSize();

}

3 个答案:

答案 0 :(得分:0)

目前,Bicycle被视为类型参数,而不是这样做:

class BicycleDataStructure <T extends Comparable<Bicycle>> {...}

现在T是类型参数,Bicycle是指接口类型。

答案 1 :(得分:0)

即使您无法修改Bicycle界面,也可以对其进行扩展。

public interface ComparableBicycle extends Bicycle, Comparable<ComparableBicycle> {
}

您的SportBicycle类可以实现ComparableBicycle,仍然是Bicycle的一个实例。编译器将要求您实现compareTo()

这将导致错误:

public class SportBicycle implements ComparableBicycle {

    // ... Implementations of Bicycle methods ...
}

直到您添加compareTo()

public class SportBicycle implements ComparableBicycle {
    /* (non-Javadoc)
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    @Override
    public int compareTo(ComparableBicycle o) {
        // TODO: Make the comparison
        return 0;
    } 

    // ... Implementations of Bicycle methods ...
}

答案 2 :(得分:0)

首先,您应该更改数据结构类的泛型类型,如下所示:

public class BicycleDataStructure<T extends Bicycle & Comparable<T>>

这称为intersection bound type,它告诉编译器数据结构将保存一个类型为BicycleComparable<T>的子类型的实例。这样就无需创建Bicycle的子类型,只是为了表示它也是该子类型的Comparable

然后,您应该使dataStructuremax属性都使用泛型T

protected List<T> dataStructure;
protected T max;

然后,在add方法中,b1参数和b局部变量也应该是T类型。这是代码:

public class BicycleDataStructure<T extends Bycycle & Comparable<T>> {

    protected List<T> dataStructure;

    protected T max;

    public BicycleDataStructure() {
        this.dataStructure = new ArrayList<>();
        this.max = null;    
    }

    public void addBicycle(T b1) {
        for (int i = 0; i < dataStructure.size(); i++) {
            T b = dataStructure.get(i);

            if (b1.compareTo(b) < 0) {
                this.dataStructure.add(i, b1);
                break;
            }   
        }    
    }
}