红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec9-Subtype Polymorphism, Comparators, Comparables, Generic Functions

Lec9-Subtype Polymorphism, Comparators, Comparables, Generic Functions

Subtype Polymorphism

Java中没有重载运算符,故我们需要使用Comparable接口来实现类似功能

Java源码中对该接口的描述如下:

我们需要实现该接口

e.g. 定义Dog类,通过size属性比较两只狗的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Lec9;

public class Dog implements Comparable<Dog>{
    public String name;
    public int size;
    public Dog(String n, int s){
        name = n;
        size = s;
    }
    @Override
    public int compareTo(Dog o) {
        if (size < o.size){
            return -1;
        }
        else if (size > o.size){
            return 1;
        }
        return 0;
    }
}

另一种写法

java规定了若更小则返回负数

1
2
3
4
@Override
public int compareTo(Dog o) {
    return size - o.size;
}

这种操作被称为子类型多态

  • 超类指定了可以干什么(如Comparable接口指定了比较功能)
  • 子类通过重写超类的抽象方法,来使java根据调用方法的对象来决定运行时该做什么

Comparator

Java提供了接口Comparator用来比较其他对象

语法:

1
2
3
4
public interface Comparator<T>{
    int compare(T o1, T o2);
    ...
}

Dog类中

1
2
3
4
5
6
7
public static class NameComparator implements Comparator<Dog> {

    @Override
    public int compare(Dog a, Dog b) {
        return a.name.compareTo(b.name);
    }
}

其中Dog.NameComparator()的数据类型为Comparator<Dog>

更现代的方式是使用lambda表达式定义comparator

1
2
Comparator<Dog> dc =(d1, d2) -> d1.name.compareTo(d2.name);
Dog maxNameDog = Collection.max(dogs,dc);

泛型函数

如何编写自己的方法

e.g. 实现一个方法,从数组中随机选择一个元素,并且接受各种类型

在这里,选择随机元素的方法是静态的,正确方式是让方法本身变为泛型,而非让类变为泛型

即声明了一个公共静态函数,用于处理类型T的对象

因为如果让整个类泛型化,你需要实例化那个类来获得泛型行为,但把该方法作为一个静态方法来看,并不需要实例化

1
2
3
4
5
6
7
publicc class RandomPicker{
    public static <T> T pickRandom(T[] x){
        Random random = new Random();
        int randomIndex = random.nextInt(x.length);
        return x[randomIndex];
    }
}