我有一个名为 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();
}
答案 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,它告诉编译器数据结构将保存一个类型为Bicycle
和Comparable<T>
的子类型的实例。这样就无需创建Bicycle
的子类型,只是为了表示它也是该子类型的Comparable
。
然后,您应该使dataStructure
和max
属性都使用泛型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;
}
}
}
}