[toc] 泛型: 首先,本人來介紹一下 什麼是泛型 : 泛型概述 : 是一種把類型明確的工作 推遲到創建對象 或者 調用方法的時候 才去 明確的特殊的類型 。 參數化類型 ,把類型當作參數一樣的傳遞。 通俗一點來講:泛型 是JAVA 中一種十分強大的機制,因為它能夠完成在 未知元素類型 的情況下對 ...
目錄
泛型:
首先,本人來介紹一下什麼是泛型:
泛型概述:
是一種把類型明確的工作 推遲到創建對象
或者 調用方法的時候才去 明確的特殊的類型。
參數化類型,把類型當作參數一樣的傳遞。
通俗一點來講:泛型 是JAVA 中一種十分強大的機制,因為它能夠完成在未知元素類型的情況下對元素進行操作。
但是,泛型只在編譯階段有效,即在編譯過程中,程式會正確的檢驗泛型結果。而編譯成功後,*.class 文件是不包含任何泛型信息的(這就是JVM 的泛型擦除機制)
並且,泛型類只能在子類或者父類被調用。
那麼,本人再來講解一下使用泛型的好處:
泛型的好處:
(1): 把運行時期的問題提前到了編譯期間
(2): 避免了強制類型轉換
(3):優化了程式設計,解決了黃色警告線
------------------------------------------------------------
註意:泛型只在編譯期有效 但在運行期就擦除了
(至於泛型擦除機制,本人將在後續的博文中提到,並且對於這個機制,本人也提出了相應的解決方法,希望同學們對此加以註意!!!)
現在,本人來講解一下有關 泛型的基本格式:
泛型類 -------- 許可權修飾符(public...) class 類名<泛型類型1,…>
泛型方法 ----- 許可權修飾符(public...) <泛型類型> 返回類型 方法名(泛型類型 變數名)
泛型變數 ----- 許可權修飾符(public...) 泛型類型 變數名
泛型介面 ----- public interface 介面名<泛型類型>
此外,本人要講解一個關於泛型,極為重要的一個知識點——通配符
A:泛型通配符<?> ------ 任意類型,如果沒有明確,那麼就是Object以及任意的Java類了
B:? extends E ---------- 向下限定,E及其子類
C:? super E ------------ 向上限定,E及其父類
那麼,本人在這裡來通過一個例子來展示一下有關 泛型的通配符的基本用法:
現在,本人用本人《詳解 繼承(上)—— 工具的抽象與分層》中所創建的Grandfather類,Parent類 和 Child類來展示下通配符的 正確用法:
package com.youzg.study;
import java.util.ArrayList;
public class AboutGeneric1 {
public static void main(String[] args) {
ArrayList<Parent> people = new ArrayList<Parent>();
ArrayList<Child> people2 = new ArrayList<Child>();
//? 泛型統配符
ArrayList<?> people3 = new ArrayList<Child>();
ArrayList<?> people4 = new ArrayList<Parent>();
//向上限定
ArrayList<? super Parent> people5 = new ArrayList<Parent>();
ArrayList<? super Parent> people6 = new ArrayList<Grandfather>();
// ArrayList<? super Parent> people7 = new ArrayList<Child>(); 報錯
//向下限定
ArrayList<? extends Parent> people8 = new ArrayList<Parent>();
ArrayList<? extends Parent> people9 = new ArrayList<Child>();
// ArrayList<? extends Parent> people1 = new ArrayList<Grandfather>(); 報錯
}
}
本人再來舉一個例子,因為在之前的博文中已經講到過“數組”的知識了,所以我們加入要對未知類型的數組進行“逆序”操作,那麼,代碼如下:
package com.mec.study;
public class AboutGeneric {
public static <T>T[] revArray(T[] m) {
T temp;
for(int i=0; i<m.length/2; i++) {
temp = m[i];
m[i] = m[m.length-i-1];
m[m.length-i-1] = temp;
}
return m;
}
}
現在,本人對上述代碼進行一下解釋:
在方法 返回值類型(即T[]) 前出現的
而這種類類型的具體情況,要等到方法被調用時,再根據實參具體類型進行判定。
這裡要特別提醒的一點是:泛型只能是類類型!
利用泛型,我們也可以來定義泛型類,代碼如下:
package com.mec.study;
public class MyGeneric<T> {
private T member;
public MyGeneric() {
}
public MyGeneric(T member) {
this.member = member;
}
public T getNumber() {
return member;
}
}
那麼,我們將泛型定義下來,如何去使用呢?
下麵,本人通過一段代碼,來展示下 定義好的泛型 的用法:
package com.mec.study;
public class DemoGeneric {
public static void main(String[] args) {
System.out.println(new MyGeneric<Integer> (1024).getNumber());
}
}
展示下運行結果:
對於上述代碼,可能有同學會有疑問,什麼是Interger?
我們接下來介紹下這篇博文的第二個主題——自動拆裝箱:
自動拆裝箱:
在第一篇博文中,本人就提到過,Java中存在八大基本類型,分別是:
byte、char、short、int、long、float、double、boolean
那麼,與之相對應的,Java也提供了8種類類型:
Byte、Character、Short、Integer、Long、Float、Double、Boolean
現在的Java,增加了“自動拆箱 和 自動裝箱”功能。
而所謂的“自動拆箱 和 自動裝箱”,
就是例如:
在需要時,JVM自動將 int類型的變數 轉換為 Integer的對象,反之亦然。
講到這裡,這篇博文的全部內容就講解完成了。
若是對上述知識點或代碼有任何疑惑、意見或者建議,請在下方評論區提出,本人將儘早予以答覆,覺得有所幫助的同學請留下小贊贊,謝謝!!!