Loading

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)来得到这个能力,再直接进行比较的时候回调该函数。

posted @ 2025-12-26 14:31  幽暗天琴沙雕  阅读(3)  评论(0)    收藏  举报