public class Dog extends Animal implements Comparable<Animal> {
private String name;
private String breed;
private boolean isPottyTrained;
public class Frog extends Animal implements Comparable<Animal> {
private String color;
private double maxJump;
private int bugsEatenPerDay;
public class Animal {
private double weight;
private double height;
private double length;
我已经创建了TreeSet
类型的Animal
。我有两个孩子Animal
(Dog
和Frog
)。我的目标是按名称顺序设置Dog
类的自然顺序,按其颜色(按字母顺序)设置Frog
类的自然顺序。
public int compareTo(Animal o) {
if (o.getClass().equals(Dog.class)) {
int temp = this.name.compareToIgnoreCase(o.getClass().getName());
if (temp == 0) {
return 0;
} else if (temp > 0) {
return 1;
} else {
return -1;
}
}
return 0;
} // I am not even sure what is producing
这是我在Dog
类中尝试过的代码,但未产生任何结果。
理想情况下,我希望代码类似于
if (this.name > o.getName()) {
...
} //pseudocode
但是我知道父母不可能访问孩子的领域。有办法解决这个问题吗?
答案 0 :(得分:0)
如果“孩子”是指子类,则应该能够通过强制转换来访问子类方法,如下所示:
((Dog) o).getName()
仅当将不太具体的类强制转换为它实现的更具体的类时,此方法才起作用,否则它将抛出ClassCastException。
完整的解决方案如下所示:
public int compareTo(Animal o) {
if (o instanceof Dog)
return this.name.compareToIgnoreCase(((Dog) o).getName());
return 0;
}
但是,此解决方案假定不是狗的所有事物都是平等的,因此您可能还希望为其他动物实现逻辑。
您提到您不知道比较函数将产生什么;它产生的数字表示以下其中一项:
例如,可用于根据您定义的规则对列表进行排序。
答案 1 :(得分:-1)
public int compareTo(Animal o) {
if (o instanceof Frog) {
int compare = this.name.compareToIgnoreCase(((Frog) o).getColor());
if (compare > 0) {
return 1;
} else if (compare < 1) {
return -1;
} else {
return 0;
}
} else if (o instanceof Dog) {
int compare = this.name.compareToIgnoreCase(((Dog) o).getName());
if (compare > 0) {
return 1;
} else if (compare < 1) {
return -1;
} else {
return 0;
}
}
return 0;
}// end compareTo
这在Dog类中。同样的原则也适用于青蛙类