引出泛型的概念
public static void main(String[] args) {
List list = new ArrayList();
list.add("1");
//list.add(false);//1
list.add(100);//2
int len = list.size();
for (int i = 0; i < len; i++) {
String value = (String) list.get(i); // 1
System.out.println("value:" + value);
}
}
以上代碼就不用解釋了,大家一看就明白,但是會出異常,信息如下
代碼1處:
value:1Exception in thread "main"
java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
at MianTest.main(MianTest.java:16)
代碼2處:
value:1
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at MianTest.main(MianTest.java:16)
以上代碼存在兩個問題:
- 集合不會記住此對象的類型
- 強制轉換類型會出錯
泛型
泛型,即“參數化類型”一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。
顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。
常常用T、E、K、V等形式的參數常用於表示泛型形參,用來接收來自外部使用時候傳入的類型實參
T爲形參,外部可以傳進來實參
public class GenericModel<T> {
private T mData;
public GenericModel(T t) {
this.mData = t;
}
public T getData() {
return mData;
}
public void setmata(T mData) {
this.mData = mData;
}
}
具體使用:
public static void main(String[] args) {
GenericModel<Boolean> z = new GenericModel<Boolean>(false);
GenericModel<String> one = new GenericModel<String>("1");
GenericModel<Integer> two = new GenericModel<Integer>(1);
System.out.println("z"+z.getData());
System.out.println("one"+one.getData());
System.out.println("two"+two.getData());
}
結果:
zfalse
oneaaa
two1
問題1: 那麼對於不同傳入的類型實參,生成的相應對象實例的類型是不是一樣的呢?
答:泛型類型在邏輯上看以看成是多個不同的類型,實際上都是相同的基本類型
補充
我們發現,在使用泛型類時,雖然傳入了不同的泛型實參,但並沒有真正意義上生成不同的類型,傳入不同泛型實參的泛型類在內存上只有一個,即還是原來的最基本的類型,當然,在邏輯上我們可以理解成多個不同的泛型類型。
究其原因,在於Java中的泛型這一概念提出的目的,導致其只是作用於代碼編譯階段,在編譯過程中,對於正確檢驗泛型結果後,會將泛型的相關信息擦出,也就是說,成功編譯過後的class文件中是不包含任何泛型信息的。泛型信息不會進入到運行時階段。