泛型Java
泛型程序设计
普通的类和方法只能使用特定的类型:基本数据类型或类类型。如果编写的代码需要应用于多种类型,这种严苛的限制对代码的束缚就会很大。
随着泛型的引入,Java有了一个表述能力很强的类型系统,允许设计者详细地描述变量和方法的类型要如何变化。泛型程序设计(generic programming)意味着编写的代码可以对多种不同类型的对象重用。
类型参数的好处
在Java中增加泛型类之前,泛型程序设计是用继承实现的。ArrayList类只维护一个Object引用数组:
public class ArrayList//泛型之前
{
private Object[] elemrntData;
...
public Object get(int i){...}
public void add(Object o){...}
}
这种方法存在两个问题。当获取一个值的时候必须进行强制类型转换。
ArrayList files = new ArrayList();
...
String filename = (String)files.get(0);
此外没有错误检查,可以向数组列表添加任意类型的的值。
files.add(new File("..."));
虽然该调用编译和运行都不会出错,但是当将get结果强制转换成String就会出错。
泛型提供了更好的解决方案:类型参数。ArrayList类有一个类型参数用来指示元素的类型:
ArrayList<String> files = new ArrayList<>();
省略的类型可以从变量的类型推断得出,编译器也可以充分利用这个类型信息。调用get的时候就可以不用强制类型转换了,编译器知道返回值类型是String,而不是Object。
而且此时可以检查,防止插入错误的对象。
定义泛型类
泛型类就是有一个或多个类型变量的类,这个类可以使得我们只关注类型而不用为数据存储的细节而分心。下面是泛型Pair类的代码:
package com.xu.generics;
public class Pair<T> {
private T first;
private T second;
public Pair() {
first = null;
second = null;
}
public Pair(T first,T second){
this.first=first;
this.second=second;
}
public T getFirst(){return first;}
public T getSecond(){return second;}
public void setFirst(T newValue) {
this.first = newValue;
}
public void setSecond(T newValue) {
this.second = newValue;
}
}
package com.xu.generics;
import java.util.ArrayList;
public class Demo01 {
public static void main(String[] args) {
Pair<String> pair1 = new Pair<>();
Pair<String> pair2 = new Pair<>("study", "java");
System.out.println("pair1:" + pair1.getFirst() + pair1.getSecond());
System.out.println("pair2:" + pair2.getFirst() + " " + pair2.getSecond());
pair1.setFirst("ok");
pair1.setSecond("ko");
System.out.println("新的pair1:" + pair1.getFirst() + pair1.getSecond());
Pair<Integer> number = new Pair<>(10, 66);
System.out.println("Integer型的pair:");
System.out.println(number.getFirst());
System.out.println(number.getSecond());
}
}
运行结果:
pair1:nullnull
pair2:study java
新的pair1:okko
Integer型的pair:
10
66
Process finished with exit code 0
比较字符串
package com.xu.generics;
public class PairTest1 {
public static void main(String[] args) {
String[] words={"Mary","Bob","Jack","Dog","Hello"};
Pair<String> mm = ArrayAlg.minmax(words);
System.out.println("min="+mm.getFirst());
System.out.println("max="+mm.getSecond());
}
}
class ArrayAlg {
/**
* 获得最小最大的字符串
* @param a 字符串数组
* @return 一个Pair(最小 , 最大)或空(null)
*/
public static Pair<String> minmax(String[] a) {
if (a == null || a.length == 0) return null;
String min = a[0];
String 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<>(min,max);
}
}
运行结果:
min=Bob
max=Mary
Process finished with exit code 0

浙公网安备 33010602011771号