public class WorthComparator implements Comparator<Värdesak> {
public int compare(Värdesak v1, Värdesak v2) {
if (v1 instanceof Apparat && v2 instanceof Apparat) {
return ((Apparat) v1).worth() > ((Apparat) v2).worth() ? 1
: ((Apparat) v1).worth() < ((Apparat) v2).worth() ? -1
: 0;
} else if (v1 instanceof Smycke && v2 instanceof Smycke) {
return ((Smycke) v1).worth() > ((Smycke) v2).worth() ? 1
: ((Smycke) v1).worth() < ((Smycke) v2).worth() ? -1
: 0;
} else if (v1 instanceof Aktie && v2 instanceof Aktie) {
return ((Aktie) v1).worth() > ((Aktie) v2).worth() ? 1
: ((Aktie) v1).worth() < ((Aktie) v2).worth() ? -1 : 0;
}
}
}
如您所见,我正在尝试比较ArrayList中的不同对象,然后按最高值在我的GUI中对它们进行排序。每个不同的对象(“ Smycke”,“ Aktie”,“设备”)都在各自的子类中,每个子类都有一种估算其值的方法。“Värdesak”是超类。
我的问题是我不知道该向谁申报退货,还是有另一种明智的方式来做到这一点?
最佳答案
在我看来,您的代码设计错误,或者您以错误的方式应用代码。由于每个“Värdesak”都值钱,因此您可以/需要在Värdesak
级别定义此方法:
public abstract class Värdesak {
public abstract double worth ();
}
接着:
public class Apparat extends Värdesak {
@Override
public double worth () {
return 500.0d;
}
}
或者,如果价格固定,则可以使用一个字段:
public abstract class Värdesak {
private double value;
public double worth () {
return worth;
}
}
现在,您可以简单地使用动态绑定原理:
public class WorthComparator implements Comparator<Värdesak> {
public int compare(Värdesak v1, Värdesak v2) {
return Double.compare(v1.worth(),v2.worth());
}
}
instanceof
calls are in general considered to be a bad smell:如果必须使用它们,那么代码的设计通常会有问题。另一个建议,请不要在标识符中使用Unicode字符:使用
Vardesak
代替Värdesak
。关于java - 具有多个子类的ArrayList对象的比较器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29409890/