泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計(jì)模式中有非常廣泛的應(yīng)用旦袋。
什么是泛型
泛型,即“參數(shù)化類型”祭阀,就是將類型由原來的具體的類型參數(shù)化,類似于方法中的變量參數(shù)袍啡,此時(shí)類型也定義成參數(shù)形式(可以稱之為類型形參),然后在使用/調(diào)用時(shí)傳入具體的類型(類型實(shí)參)嗅剖。
泛型的本質(zhì)是為了參數(shù)化類型(在不創(chuàng)建新的類型的情況下强缘,通過泛型指定的不同類型來控制形參具體限制的類型)。也就是說在泛型使用過程中,操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)崖疤,這種參數(shù)類型可以用在類、接口和方法中豪嚎,分別被稱為泛型類囊嘉、泛型接口扭粱、泛型方法琢蛤。
泛型的基本寫法
泛型類型用于類的定義中,被稱為泛型類峰髓。通過泛型可以完成對(duì)一組類的操作對(duì)外開放相同的接口。最典型的就是各種容器類浪汪,如:List、Set、Map趣惠。
下面泛型類的最基本寫法
class 類名稱 <泛型標(biāo)識(shí)>{
private 泛型標(biāo)識(shí) /*(成員變量類型)*/ var;
.....
}
}
下面是一個(gè)最普通的泛型類寫法示例:
public class Generic<T>{
private T key;
public Generic(T key) {
this.key = key;
}
public T getKey() {
return key;
}
}
獲取泛型子類中實(shí)際使用的泛型類的方法
看下面的例子:
public class Generic<T>{
}
public class GenericNumber extends Generic<Integer> {
}
那么能否在Generic中獲取GenericNumber類中泛型具化后的類對(duì)象呢狸棍?像普通類那樣身害,使用T.class 是不行的。
下面給出具體代碼
protected Class getImplementClass() {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (0 >= params.length) {
return Object.class;
}
if (!(params[0] instanceof Class)) {
return Object.class;
}
return (Class) params[0];
}
測(cè)試
public class Generic<T>{
protected Class getImplementClass() {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (0 >= params.length) {
return Object.class;
}
if (!(params[0] instanceof Class)) {
return Object.class;
}
return (Class) params[0];
}
}
public class GenericNumber extends Generic<Integer> {
}
public class GenericTest {
public static void main(String[] argv) {
GenericNumber a = new GenericNumber();
System.out.println(a.getImplementClass().getName());
}
}
得到如下結(jié)果
java.lang.Integer