泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。
我们先来看个例子:
List list = new ArrayList();
list.add("aikaifa");
list.add(1);
for (int i = 0; i < list.size(); i++) {
System.out.println("result: " + (String) list.get(i));
}
不出意外,程序运行时出错了:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
ArrayList可以存放任意类型,刚才我们添加了一个String类型,接着又添加了一个Integer类型,再使用时都以String的方式使用,结果程序崩溃了。为了能在在编译阶段就发现类似问题,泛型可以避免。
下面我们将第一行声明初始化list的代码稍微改一下,编译器会在编译阶段就能够帮我们发现类似这样的问题。
泛型的使用
泛型类
泛型接口
泛型方法
泛型类
我们先定义一个简单的Book类:
public class Book {
private String object;
public void set(String object) { this.object = object; }
public String get() { return object; }
}
这是最常见的做法,这样做的不足就是Book里面现在只能装入String类型的元素,要是以后我们需要装入Integer等其他类型的元素,还必须要另外重写一个Book,代码得不到复用,使用泛型可以很好的解决这个问题。
public class Book<T> {
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
这样我们的Book类便可以得到复用,我们可以将T替换成任何我们想要的类型:
Book<Integer> integerBox = new Book<Integer>();
Book<Double> doubleBox = new Book<Double>();
Book<String> stringBox = new Book<String>();
泛型方法
声明一个泛型方法我们只要在返回类型前面加上一个类似<K, V>的形式,例如:
public class Util {
public static <K, V> boolean compare(Book<K, V> book1, Book<K, V> book2) {
return book1.getKey().equals(book2.getKey()) &&
book1.getValue().equals(book2.getValue());
}
}
public class Book<K, V> {
private K key;
private V value;
public Book(K key, V value) {
this.key = key;
this.value = value;
}
public void setKey(K key) { this.key = key; }
public void setValue(V value) { this.value = value; }
public K getKey() { return key; }
public V getValue() { return value; }
}
我们可以像下面这样去调用泛型方法:
Book<Integer, String> book1 = new Book<>(1, "computer");
Book<Integer, String> book2= new Book<>(2, "technology");
Util.<Integer, String>compare(book1, book2);
篇幅有限,泛型接口、通配符等留在下节。
联系客服