ArrayAlg.java
public class ArrayAlg {
public static <T extends Comparable> Pair<T> minmax(T[] a){
if(a ==null||a.length==0)
return null;
T min=a[0];
T max=a[0];
for (int i=1;i<a.length;i++){
if(min.compareTo(a[i])>0)
min=a[i];
if(max.compareTo(a[i])<0)
max=a[i];
}
return new Pair<T>(min,max);
}
}
Pair.java
public class Pair<T> {
private T first;
private T second;
public Pair(T first,T second){
this.first=first;this.second=second;
}
public T getFirst() {
return first;
}
public T getSecond() {
return second;
}
}
Test.java
public class Test {
public static void main(String[] args) {
String[] a={"XTY","LPJ","A","GY"};
Pair<String> mm=ArrayAlg.minmax(a);
System.out.println("min=" + mm.getFirst());
System.out.println("max=" + mm.getSecond());
}
}
min输出第一个字母最小的字符串,max输出第一个字母最大的字符串
本例中输出:min=A,max=XTY
Test2.java
import java.time.LocalDate;
public class Test {
public static void main(String[] args) {
LocalDate[] birthdays = {
LocalDate.of(1906, 12, 9),
LocalDate.of(1999,12,4),
LocalDate.of(1815, 12, 10),
};
Pair<LocalDate> mm=ArrayAlg.minmax(birthdays);
System.out.println("min=" + mm.getFirst());
System.out.println("max=" + mm.getSecond());
}
}
min输出最小的日期1815-12-10,max输出最大日期1999-12-4
代码来源:《Java核心技术第一卷 11版》P328-P330
除了书中介绍外简要谈谈我的理解:
1、
泛型类用<T>的话则起到类似于黑盒测试的作用,使用人员关注点不在于内部怎么实现的,泛型类的编写交给开发人员即可,但是开发人员要表明外界可以用哪些类型测试,本例中由于compareto接口的存在所以Test类中只能用实现了compareto接口的类型比如String,LocalDate,Integer使用。
2、
ArrayAlg类和Pair类都用到了类型变量T,相当于可以接纳外界很多种类型,比如Test.java中外界用的是String[]测试,而Test2.java中外界用的是LocalDate[]测试,泛型类的使用使得两者都可以得到结果输出
3、
Test和Test2中 Pair<String> mm=ArrayAlg.minmax(a);不能写成Pair<T> mm=ArrayAlg.minmax(a);这类似于向下转型。从泛型Pair类转到具体的Pair类,否则编译器无法识别Pair具体是什么类