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];
}
}