1.本节重点
泛型范围约束,如本节标题所述,要编写一个泛型排序方法,是必须要有一定的约束条件的,而泛型提供的范围约束修饰符是实现稳定的泛型排序方法的关键。
如果我们希望声明的泛型只能是某些接口或类的子类,我们可以这样做: <T extends Comparable<T>>
如果我们希望声明的泛型只能是某些接口或类的父类,我们可以这样做: <T super Comparable<T>>
其中Comparable就是我们说的某些类或接口,如果我们尝试传入不符合上面声明条件的类型进去的话,会在编译器就报错。
2.实例学习
我们尝试编写一个限制类型的泛型排序方法和获取最大值最小值的方法。
2.1 实现代码
代码如下:
public class GenericComparison {
/**
* 获得泛型数组array中最小的元素(元素必须实现了Compareable接口)
* @param array 泛型数组
* @param <T> 类型变量
* @return 元素
*/
public static <T extends Comparable<T>> T getMin(T[] array) {
if (array == null || array.length == 0) {
return null;
}
T min = array[0];
for (int i = 1; i < array.length; i++) {
if (min.compareTo(array[i]) > 0) {
min = array[i];
}
}
return min;
}
public <T extends Comparable> T getMax(T[] array) {
if (array == null || array.length == 0) {
return null;
}
T max = array[0];
for (int i = 1; i < array.length; i++) {
if (max.compareTo(array[i]) < 0) {
max = array[i];
}
}
return max;
}
/**
* 泛型排序方法:采用冒泡排序
* @param array
* @param <T>
* @return
*/
public static <T extends Comparable> T[] sorted(T[] array){
if (array == null || array.length == 0) {
return null;
}
for (int i = 0; i < array.length; i++) {
for(int j=0;j<array.length;j++){
if(array[i].compareTo(array[j])<0){
T temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
return array;
}
}
2.2 测试反例
public class GenericComparisonTest {
public static void main(String[] args) {
Object[] objects = new Object[10];
Object test = GenericComparison.getMin(objects);
}
}
2.3 测试正例
package GenericStudy.Exa135;
public class GenericComparisonTest {
public static void main(String[] args) {
String[] books = { "Java从入门到精通(第2版)", "Java编程宝典", "细说Java", "视频学Java" };
Integer[] nums={5,4,6,8,6};
System.out.println("麻子新书列表:");
for (String book : books) {
System.out.println(book);
}
String min = GenericComparison.getMin(books);
System.out.println("按名称排序的第一本书:");
System.out.println(min);
String[] result=GenericComparison.sorted(books);
System.out.println("排序后:");
for(String a:result){
System.out.println(a);
}
Integer[] numResult=GenericComparison.sorted(nums);
for(Integer a:numResult){
System.out.println(a);
}
}
}
运行之: