A. java中什麼是泛型,怎麼用泛型
最簡單的運用:List<String> list = new ArrayList<String>();
這個是什麼意思?
意思就是list只裝String類型的數據,別的,裝不進去
然後你版就會覺得這個好權像有點封裝的意思,比如LIst<Student>,封裝學生類
所以,所謂泛型就是廣泛的數據類型,你可以把它理解成封裝
B. java中泛型的使用
泛型可以避免強制類型轉換,設定集合對象中存儲的對象類型。
比如List<String> list = new ArrayList<String>();
那在這個list中,只能存儲字元串對象。
C. java泛型的作用,舉例說明!
簡言之,泛型是為了避免類轉換異常的發生,使程序操作更安全,舉例:
1、聲明泛型:
class Point<T>{
private T var;
public T getVar(){
return var;
}
public void setVar(T var){
this.var=var;
}
}
2、使用Point類將var的類型設置成整數
public class Test{
public static void maint(String[] args){
Point<Integer> p=new Point<Integer>();//var類型為Integer
p.setVar(30);//設置數字,自動裝箱
System.out.println(p.getVar() * 2);
}
}
3、運行:60
分析:使用泛型強制類型為某類型,比如上面為Integer,在使用setVar()方法時如果參數不是Integer(如String),程序就會報錯,提示輸入非法。當然你認為也可以不用泛型,比如將Point定義如下:
class Point1{
private Object var;
public Object getVar(){
return var;
}
public void setVar(Object var){
this.var=var;
}
}
此時,Test程序依然可以運行,但是如果將Test改動如下:
public class Test{
public static void maint(String[] args){
Point1 p=new Point1();
p.setVar(「江山美人");
System.out.println(p.getVar() * 2);
}
}
程序編寫正常,不會報錯,但到了運行才提示異常。而如果上面是應用泛型,在寫下System.out.println(p.getVar() * 2);直接就會在寫程序時提示錯誤!
這樣就達到了使用泛型的目的——避免類轉換異常的發生,使程序操作更安全。
希望能幫到你!
D. java中什麼是泛型,怎麼用泛型
Java泛型是一種強大的特性,自從JDK1.5引入後,極大提升了開發效率。泛型允許我們編寫在運行時能夠動態替換成任何類型的方法和類,避免了繁瑣的類型轉換。然而,許多開發者對泛型的實現原理並不清楚。本文將從以下幾個方面深入探討Java泛型:
Java泛型的實現方式基於"類型擦除"(Type erasure generics)。具體來說,泛型只存在於源代碼中,編譯器在編譯過程中會將泛型信息擦除,最終生成的位元組碼中不存在泛型。比如,一個泛型方法在編譯後會變成如下形式:
觀察setParam方法的位元組碼,我們可以看到泛型參數T已經被擦除,最終替換成了Object。如果泛型參數為T extends String,則最終泛型擦除後將變成String。同時,泛型的返回值也被替換成了Object。為了確保代碼的正確性,編譯器在獲取泛型值時會插入類型轉換。
Java泛型的類型擦除帶來了若幹缺陷。首先,泛型參數被擦除後,只能處理引用類型,對於基本數據類型(如int、long等)則無法處理。為了彌補這一不足,Java不允許使用原始類型泛型,只能使用包裝類的泛型。此外,為了方便開發人員,Java還提供了原生數據類型的自動拆箱/裝箱特性。
運行效率方面,泛型擦除後,對於方法輸入參數(參數位置)無需類型轉換,但當泛型參數出現在方法的輸出位置(返回值)時,調用者需要進行類型轉換,編譯器會插入檢查類型位元組碼。對於基本數據類型的泛型,編譯器還需要進行裝箱/拆箱操作。
另外,由於泛型在運行時被擦除,Java虛擬機無法獲取泛型的實際類型,這可能導致代碼的非直觀性。例如,兩個看似不同類型的集合在編譯後都是ArrayList,如果在if語句中直接比較它們,代碼可能會被執行,這與直覺不符。此外,在實現泛型相關的操作時,如將泛型List轉換為數組,開發人員需要額外傳遞Class類型來指定數組的類型。
Java泛型的歷史背景同樣值得探討。Java泛型最早在JDK5中引入,受到C++模板的啟發。Java核心開發團隊在與Martin Odersky合作開發"Generic Java"項目時,目標是為Java添加泛型支持,但最終設計不得不與C#泛型實現方式有所差異。主要原因是Java需要保證嚴格的向後兼容性,即確保JDK1.2編譯出的Class文件在後續版本的JDK中也能正常運行。這要求新的泛型實現方式不能引入任何在舊版本中不存在的限制。Java選擇了類型擦除的實現方式,以最小化對現有代碼的影響,同時也保證了向後兼容性。
總結來說,Java泛型雖然強大,但在實現過程中不得不做出一些妥協,以確保語言的穩定性與向後兼容性。對於開發者來說,理解這些實現細節有助於更好地利用泛型特性,同時也能對Java語言的發展歷史有更深入的了解。雖然當前Java泛型存在一些局限性,但相信隨著技術的進步和未來版本的更新,這些問題將得到解決。
E. Java 泛型 T,E,K,V,,傻傻分不清
Java 泛型(generics)是 JDK 5 引入的新特性,提供了編譯時類型安全檢測機制。泛型的核心在於參數化類型,允許操作的數據類型作為參數。相比之前通過類型 Object 實現的「任意化」,泛型在編譯時就能檢查類型安全,避免運行時錯誤,實現自動和隱式的類型轉換。
使用泛型帶來的好處顯而易見,它允許在類、方法、介面中定義類型參數,如 T、E、K、V 等。這些通配符實質上都是類型參數的約定,比如 T 可以替換為 A-Z 中的任意字母。在代碼中使用 T、E、K、V、? 時,它們之間的區別主要在於可讀性和類型操作的限制。
下面通過實例來說明。假設有一個父類 Animal 和其子類,如狗、貓等。使用泛型定義列表時,可以是這樣的:
而老闆可能需要定義一個更通用的類型參數列表,即:
通配符 ? 的使用是泛型中的一大特點,表示可以持有任何類型。在方法參數或局部變數中使用 ?,允許接收任何類型的參數,但不能進行類型操作。例如,在方法中使用 ? 時,只能接收類型參數,不能賦值給具體類型。T 類型則用於定義泛型類和方法,確保泛型參數的一致性。
此外,通配符 ? 的使用限制了類型操作,不能進行多重限定或超類限定。在定義泛型介面或類時,可以使用 & 符號設定多重邊界(Multi Bounds),指定泛型類型必須同時滿足多個介面或父類的要求。而 ? 的限定方式僅有上下界,分別使用 extends 和 super 關鍵字。
在反射場景下,Class 類是一個通配泛型,可以代表任何類型。而在實例化時,需要替換成具體類。Class 類常用於聲明類型限制,確保在運行時類型安全。例如:
因此,Class 類在聲明時可以使用通配符 ?,表示可以接收任意類型的 Class 實例,適用於聲明時的類型限制。
總結,Java 泛型通過類型參數、通配符和 Class 類提供了強大的類型安全機制。通過 T、E、K、V、? 等類型參數,以及 Class 類的使用,開發者可以構建類型安全的代碼,避免運行時錯誤,增強代碼的可讀性和靈活性。
F. Java 泛型如何使用
public class Test<T> {
private T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
public static void main(String[] args) {
Test<String> stringTest = new Test<String>();
stringTest.setName("aaa");
System.out.println(stringTest.getName());
Test<Integer> integerTest = new Test<Integer>();
integerTest.setName(1111);
System.out.println(integerTest.getName());
}
}