① 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);直接就會在寫程序時提示錯誤!
這樣就達到了使用泛型的目的——避免類轉換異常的發生,使程序操作更安全。
希望能幫到你!
② java泛型有什麼作用
java 泛型是java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。這種參數類型可以用在類、介面和方法的創建中,分別稱為泛型類、泛型介面、泛型方法。
泛型(Generic type 或者 generics)是對 Java 語言的類型系統的一種擴展,以支持創建可以按類型進行參數化的類。可以把類型參數看作是使用參數化類型時指定的類型的一個佔位符,就像方法的形式參數是運行時傳遞的值的佔位符一樣。
可以在集合框架(Collection framework)中看到泛型的動機。例如,Map 類允許您向一個 Map 添加任意類的對象,即使最常見的情況是在給定映射(map)中保存某個特定類型(比如 String)的對象。
因為 Map.get() 被定義為返回 Object,所以一般必須將 Map.get() 的結果強制類型轉換為期望的類型,如下面的代碼所示:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
要讓程序通過編譯,必須將 get() 的結果強制類型轉換為 String,並且希望結果真的是一個 String。但是有可能某人已經在該映射中保存了不是 String 的東西,這樣的話,上面的代碼將會拋出 ClassCastException。
理想情況下,您可能會得出這樣一個觀點,即 m 是一個 Map,它將 String 鍵映射到 String 值。這可以讓您消除代碼中的強制類型轉換,同時獲得一個附加的類型檢查層,該檢查層可以防止有人將錯誤類型的鍵或值保存在集合中。這就是泛型所做的工作。
泛型的好處
Java 語言中引入泛型是一個較大的功能增強。不僅語言、類型系統和編譯器有了較大的變化,以支持泛型,而且類庫也進行了大翻修,所以許多重要的類,比如集合框架,都已經成為泛型化的了。
這帶來了很多好處:
1,類型安全。 泛型的主要目標是提高 Java 程序的類型安全。通過知道使用泛型定義的變數的類型限制,編譯器可以在一個高得多的程度上驗證類型假設。沒有泛型,這些假設就只存在於程序員的頭腦中(或者如果幸運的話,還存在於代碼注釋中)。
2,消除強制類型轉換。 泛型的一個附帶好處是,消除源代碼中的許多強制類型轉換。這使得代碼更加可讀,並且減少了出錯機會。
3,潛在的性能收益。 泛型為較大的優化帶來可能。在泛型的初始實現中,編譯器將強制類型轉換(沒有泛型的話,程序員會指定這些強制類型轉換)插入生成的位元組碼中。但是更多類型信息可用於編譯器這一事實,為未來版本的 JVM 的優化帶來可能。由於泛型的實現方式,支持泛型(幾乎)不需要 JVM 或類文件更改。所有工作都在編譯器中完成,編譯器生成類似於沒有泛型(和強制類型轉換)時所寫的代碼,只是更能確保類型安全而已。
Java語言引入泛型的好處是安全簡單。泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高代碼的重用率。
泛型在使用中還有一些規則和限制:
1、泛型的類型參數只能是類類型(包括自定義類),不能是簡單類型。
2、同一種泛型可以對應多個版本(因為參數類型是不確定的),不同版本的泛型類實例是不兼容的。
3、泛型的類型參數可以有多個。
4、泛型的參數類型可以使用extends語句,例如<T extends superclass>。習慣上成為「有界類型」。
5、泛型的參數類型還可以是通配符類型。例如Class<?> classType = Class.forName(Java.lang.String);
泛 型還有介面、方法等等,內容很多,需要花費一番功夫才能理解掌握並熟練應用。在此給出我曾經了解泛型時候寫出的兩個例子(根據看的印象寫的),實現同樣的 功能,一個使用了泛型,一個沒有使用,通過對比,可以很快學會泛型的應用,學會這個基本上學會了泛型70%的內容。
③ Java中泛型的具體應用!!!
2對。第一個只是引用加了泛型,對象未加泛型。建議使用List<String> list=new ArrayList<>();來加泛型。
④ java中什麼是泛型,怎麼用泛型
最簡單的運用:List<String> list = new ArrayList<String>();
這個是什麼意思?
意思就是list只裝String類型的數據,別的,裝不進去
然後你就會覺得這個好像有點封裝的意思,比如LIst<Student>,封裝學生類
所以,所謂泛型就是廣泛的數據類型,你可以把它理解成封裝
⑤ java 泛型的幾種用法
1. public class DAO<T> {
/**
* 泛型類
* 聲明類的同時聲明泛型類型
* 1.方法的返回值可以是使用聲明的泛型類型
* 2.方法的參數也可以是聲明類的泛型類型
* 3.方法體內可以使用泛型類型
*/
public T get(Integer id){
return null;
}
public void save(T entity){
}
}
2.
/**
* 泛型方法: 在方法聲明時, 同時聲明泛型. 在方法的返回值, 參數列表以及方法體中都可以使用泛型類型.
* public static <T> T get(Integer id){
* T result = null;
* return result;
* }
* 把指定類型的數組中的元素放入到指定類型的集合中
*/
⑥ java中的泛型具體能應用在哪些方面上
泛型本質上是提供類型的"類型參數",它們也被稱為參數化類型(parameterized type)或參量多態(parametric polymorphism)。其實泛型思想並不是 Java 最先引入的,C++ 中的模板就是一個運用泛型的例子。
具體應用會在實際開發中領悟到的!
⑦ java泛型的高級應用
在上面的例子中,由於沒有限制class GenericsFoo<T>類型持有者T的范圍,實際上這里的限定類型相當於Object,這和「Object泛型」實質是一樣的。限制比如我們要限制T為集合介面類型。只需要這么做:
class GenericsFoo<T extends Collection>,這樣類中的泛型T只能是Collection介面的實現類,傳入非Collection介面編譯會出錯。
注意:<T extends Collection>這里的限定使用關鍵字extends,後面可以是類也可以是介面。但這里的extends已經不是繼承的含義了,應該理解為T類型是實現Collection介面的類型,或者T是繼承了XX類的類型。
下面繼續對上面的例子改進,我只要實現了集合介面的類型: publicclassCollectionGenFoo<TextendsCollection>{privateTx;publicCollectionGenFoo(Tx){this.x=x;}publicTgetX(){returnx;}publicvoidsetX(Tx){this.x=x;}}實例化的時候可以這么寫: {publicstaticvoidmain(Stringargs[]){CollectionGenFoo<ArrayList>listFoo=null;listFoo=newCollectionGenFoo<ArrayList>(newArrayList());//出錯了,不讓這么干。//原來作者寫的這個地方有誤,需要將listFoo改為listFoo1//需要將CollectionGenFoo<Collection>改為CollectionGenFoo<ArrayList>//CollectionGenFoo<Collection>listFoo1=null;//listFoo1=newCollectionGenFoo<ArrayList>(newArrayList());System.out.println("實例化成功!");}}當前看到的這個寫法是可以編譯通過,並運行成功。可是注釋掉的兩行加上就出錯了,因為<T extends Collection>這么定義類型的時候,就限定了構造此類實例的時候T是確定的一個類型,這個類型實現了Collection介面,但是實現 Collection介面的類很多很多,如果針對每一種都要寫出具體的子類類型,那也太麻煩了,我乾脆還不如用Object通用一下。別急,泛型針對這種情況還有更好的解決方案,那就是「通配符泛型」。 雖然Java泛型簡單的用 extends 統一的表示了原有的 extends 和 implements 的概念,但仍要遵循應用的體系,Java 只能繼承一個類,但可以實現多個介面,所以你的某個類型需要用 extends 限定,且有多種類型的時候,只能存在一個是類,並且類寫在第一位,介面列在後面,也就是:
<T extends SomeClass & interface1 & interface2 & interface3>
這里的例子僅演示了泛型方法的類型限定,對於泛型類中類型參數的限制用完全一樣的規則,只是加在類聲明的頭部,如: publicclassDemo<TextendsComparable&Serializable>{//T類型就可以用Comparable聲明的方法和Seriablizable所擁有的特性了} 為了解決類型被限制死了不能動態根據實例來確定的缺點,引入了「通配符泛型」,針對上面的例子,使用通配泛型格式為<? extends Collection>,「?」代表未知類型,這個類型是實現Collection介面。那麼上面實現的方式可以寫為: {publicstaticvoidmain(Stringargs[]){CollectionGenFoo<ArrayList>listFoo=null;listFoo=newCollectionGenFoo<ArrayList>(newArrayList());//出錯了,不讓這么干。//原來作者寫的這個地方有誤,需要將listFoo改為listFoo1//CollectionGenFoo<Collection>listFoo1=null;//listFoo1=newCollectionGenFoo<ArrayList>(newArrayList());System.out.println("實例化成功!");}}注意:
1、如果只指定了<?>,而沒有extends,則默認是允許Object及其下的任何Java類了。也就是任意類。
2、通配符泛型不單可以向下限制,如<? extends Collection>,還可以向上限制,如<? super Double>,表示類型只能接受Double及其上層父類類型,如Number、Object類型的實例。
3、泛型類定義可以有多個泛型參數,中間用逗號隔開,還可以定義泛型介面,泛型方法。這些都與泛型類中泛型的使用規則類似。
⑧ java泛型有什麼用
可以直接說:樓上的SB,范型是解決對象轉型而來.范型是強制類型,省去了轉型的煩惱[類型不符編譯時報錯]
⑨ java泛型的用法給高分,謝謝
泛型就是指定容器中必須裝什麼類型的東西,把運行時會產生的異常提前放到了編碼階段。
你可以不加泛型,然後程序運行出錯之後再進行修改。加了泛型之後不用運行,寫代碼的時候就能知道哪的類型錯了。
純手打
⑩ java泛型有什麼用
泛型。規定了此集合中元素的類型。例如:ArrayListarr=newArrayList();這樣就創建了一個包含整數的ArrayList對象。如果要自己定義泛型類,就用如下形式:classMyCollection{}尖括弧中的類型可以有限制,例如你需要讓MyCollection中的類型都具有可比性,可以用如下格式:classMyCollection{}此外,要注意泛型的一些特性:1.不能直接創建泛型數組。如newArrayList[5]之類的是錯的。只能用如下方法:newArrayList[5]或者(ArrayList[])newArrayList[5];2.靜態方法中需要小心,因為E一般是非靜態類型,如果你這樣寫:classMyCollection{publicstaticMyCollectionabc(){}}是錯的。你只能把去掉。