说我有这个课程:
public class Bucket<T> {
T filling;
}
,fill属性可以是以下任何一个的实例:
public class Oil{
float volume;
}
或
public class Water{
float volume;
}
在我的代码的一部分中,我有一个Buckets列表:
LinkedList<Bucket> list;
现在,我想通过属性“volume”来命令“list”(Bucket)的元素。
但我无法比较T.volume
。那么,我该怎么做?
如果我的问题很愚蠢,我提前抱歉,我还在学习java。
答案 0 :(得分:1)
我回答你,假设这是一个理论上的问题,我不建议你实施,而是找到一个更好的模式来做你想做的事。
您想要对Bucket列表进行排序。要调用Collections.sort()方法,Bucket需要实现Comparable(以便定义compareTo方法)。
您应该定义由“填充”元素实现的界面
interface Element {
float getVolume();
void setVolume(float volume);
}
class Oil implements Element {
float volume;
@Override
public float getVolume() {
return volume;
}
@Override
public void setVolume(float volume) {
this.volume = volume;
}
}
class Water implements Element {
float volume;
@Override
public float getVolume() {
return volume;
}
@Override
public void setVolume(float volume) {
this.volume = volume;
}
}
现在您可以定义Bucket类:
class Bucket implements Comparable<Bucket> {
Element filling;
@Override
public int compareTo(Bucket o) {
return Float.compare(filling.getVolume(), o.filling.getVolume());
}
}
这段代码:
public static void main(String[] args) {
List<Bucket> elems = new LinkedList<>();
Bucket o = new Bucket();
o.filling = new Oil();
o.filling.setVolume(5);
Bucket w = new Bucket();
w.filling = new Water();
w.filling.setVolume(12);
elems.add(w);
elems.add(o);
Collections.sort(elems);
for(Bucket b: elems) {
System.out.println(b.filling.getVolume());
}
}
将打印:
5.0
12.0
我感到羞耻我编写了整个代码,但通过阅读本文比阅读我能写的错误解释更容易理解。