10. Subtype Polymorphism vs. HoFs
约 348 字大约 1 分钟
2025-05-10
Comparable
前两节课我们主要在讲继承。继承可以复用代码,子类还可以通过覆盖来对父类方法进行一些修改,此外继承还有一个好处:实现多态。
这节课我们将写一个函数,找出任意类型的数组中最大的元素。
首先我们写一个 maxDog 函数:
public static Dog maxDog(Dog[] dogs) {
if (dogs == null || dogs.length == 0) {
return null;
}
Dog maxDog = dogs[0];
for (Dog d : dogs) {
if (d.size > maxDog.size) {
maxDog = d;
}
}
return maxDog;
}
功能实现了,但是如果对象换成猫、鲸鱼什么的,又用不了了。
这里我们借助接口继承来实现。
// 写一个OurComparable接口
public interface public interface OurComparable {
public int compareTo(Object o);
}
// Dog实现接口
public class Dog implements OurComparable {
private String name;
private int size;
public Dog(String n, int s) {
name = n;
size = s;
}
public void bark() {
System.out.println(name + " says: bark");
}
public int compareTo(Object o) {
Dog uddaDog = (Dog) o;
if (this.size < uddaDog.size) {
return -1;
} else if (this.size == uddaDog.size) {
return 0;
}
return 1;
}
}
// 这个类负责找最大值
public class Maximizer {
public static OurComparable max(OurComparable[] items) {
int maxDex = 0;
for (int i = 0; i < items.length; i += 1) {
int cmp = items[i].compareTo(items[maxDex]);
if (cmp > 0) {
maxDex = i;
}
}
return items[maxDex];
}
}
自己写太麻烦了,其实 Java 自己写了一个 Comparable 接口,而且还支持泛型。调用就行。
Comparator
除了 Comparable 接口,还有 Comparator 接口也可以做比较。
public interface Comparator<T> {
int compare(T o1, T o2);
}