CS61B_Lecture10
子类型多态 vs. HoFs
子类型多态
多态性是指多种形式。在面向对象的思想中,指的是一个对象可以是多个类的实例,可以是自身,超类甚至超超类的实例。
最大函数
判断以下代码中有多少个编译错误:
public static Object max(Object[] items) {
int maxDex = 0;
for (int i = 0; i < items.length; i += 1) {
if (items[i] > items[maxDex]) {
maxDex = i;
}
}
return items[maxDex];
}
public static void main(String[] args) {
Dog[] dogs = {new Dog("Elyse", 3), new Dog("Sture", 9), new Dog("Benjamin", 15)};
Dog maxDog = (Dog) max(dogs);
maxDog.bark();
}
答案是: if (items[i] > items[maxDex]) {
这里默认了里面对象是可比较的。
我们这里有个更泛化的实现比较的方式方式,那就是通过实现一个我们自定义的OurComparable接口,达到可以比较的目的。
public interface OurComparable {
public int compareTo(Object o);
}
Dog类实现了OurComparable接口之后便可以实现 compareTo函数,从而进行比较。
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;
return this.size - uddaDog.size;
}
}
接口测验
当实现了OurComparable类,程序在编译阶段就会检查是否真的实现了该接口的所有方式,如果没有就会编译错误。
Comparables 可比较对象
实际上java官方已经实现了一个这样的接口,称为 Comparable 。
public class Dog implements Comparable<Dog> {
...
public int compareTo(Dog uddaDog) {
return this.size - uddaDog.size;
}
}
Comparator 比较器
public interface Comparator<T> {
int compare(T o1, T o2);
}
通过比较器,我们可以自定义要比较的东西:
import java.util.Comparator;
public class Dog implements Comparable<Dog> {
...
public int compareTo(Dog uddaDog) {
return this.size - uddaDog.size;
}
private static class NameComparator implements Comparator<Dog> {
public int compare(Dog a, Dog b) {
return a.name.compareTo(b.name);
}
}
public static Comparator<Dog> getNameComparator() {
return new NameComparator();
}
}
总结
java中要实现像python中那种HOFs是不支持直接传递函数的,所以我们需要用另外的办法——接口继承。假如我们需要实现max函数,然后max函数中需要compareTo函数,此时在python中我们可以使用HOFs直接把实现好的compareTo传递进去使用。而在java中,我们需要继承一个接口,获取并实现相应的函数(compareTo)来得到这个能力,再直接进行比较的时候回调该函数。

浙公网安备 33010602011771号