當前位置:首頁 » 編程語言 » java泛型使用

java泛型使用

發布時間: 2022-07-30 07:38:32

java泛型有什麼作用泛型是實泛型還是偽泛型

泛型好處:

泛型簡單易用

類型安全 泛型的主要目標是實現java的類型安全。 泛型可以使編譯器知道一個對象的限定類型是什麼,這樣編譯器就可以在一個高的程度上驗證這個類型

消除了強制類型轉換 使得代碼可讀性好,減少了很多出錯的機會

Java語言引入泛型的好處是安全簡單。泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高代碼的重用率。

泛型的實現原理

泛型的實現是靠類型擦除技術 類型擦除是在編譯期完成的 也就是在編譯期 編譯器會將泛型的類型參數都擦除成它的限定類型,如果沒有則擦除為object類型之後在獲取的時候再強制類型轉換為對應的類型。 在運行期間並沒有泛型的任何信息,因此也沒有優化。

泛型不考慮繼承

List 類型 是否 可以 賦值為 List類型 ?
答案是不可以的
雖然說在賦值之後 String類型可以當做 Object類型使用 但是還是會出現問題

參考:《2020最新Java基礎精講視頻教程和學習路線!》

② 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中什麼是泛型,怎麼用泛型

最簡單的運用:List<String> list = new ArrayList<String>();
這個是什麼意思?
意思就是list只裝String類型的數據,別的,裝不進去
然後你就會覺得這個好像有點封裝的意思,比如LIst<Student>,封裝學生類
所以,所謂泛型就是廣泛的數據類型,你可以把它理解成封裝

④ 如何在Java程序中使用泛型

在使用泛型前,存入集合中的元素可以是任何類型的,當從集合中取出時,所有的元素都是Object類型,需要進行向下的強制類型轉換,轉換到特定的類型。
比如:
List myIntList = new LinkedList(); // 1

myIntList.add(new Integer(0)); // 2

Integer x = (Integer) myIntList.iterator().next(); // 3

第三行的這個強制類型轉換可能會引起運行時的錯誤。
泛型的思想就是由程序員指定類型,這樣集合就只能容納該類型的元素。
使用泛型:
List<Integer> myIntList = new LinkedList<Integer>(); // 1'

myIntList.add(new Integer(0)); // 2'

Integer x = myIntList.iterator().next(); // 3'

將第三行的強制類型轉換變為了第一行的List類型說明,編譯器會為我們檢查類型的正確性。這樣,代碼的可讀性和健壯性也會增強。

泛型使用基礎
例如:

public interface List <E>
{
void add(E x);
Iterator<E> iterator();
}

public interface Iterator<E>
{
E next();
boolean hasNext();
}

尖括弧中包含的是形式類型參數(formal type parameters),它們就如同一般的類型一樣,可以在整個類的聲明中被使用。
當類被使用時,會使用具體的實際類型參數(actual type argument)代替。
比如前面的例子中的List<Integer>,那麼所有的E將會被Integer類型所代替。
泛型類型參數只能被類或介面類型賦值,不能被原生數據類型賦值,原生數據類型需要使用對應的包裝類。
形式類型參數的命名:盡量使用單個的大寫字母(有時候多個泛型類型時會加上數字,比如T1,T2),比如許多容器集合使用E,代表element(元素),Map中用K代表鍵keys,V代表值。

⑤ Java 泛型如何使用

拿LIST做例子吧,泛型就是保證了LIST存儲的內容的類型。
比如List<String> slist,那就可以直接往slist里存String類型的東西,取出來時也不用做類型轉換,直接slist.get(i)就是取出內容了。如果非泛型的LIST,取出來是object類型,要做類型轉換

⑥ 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中的泛型用法一種: <T> 返回值用法。

1、對於泛型方法來說,是可以接收不同類型的參數,比如下圖,使用泛型來操作List集合,然後向List中添加一條數據,看是否可以添加成功,創建泛型方法如圖所示。

⑧ java泛型類的定義和使用

泛型就是在類後面打個尖括弧
然後裡面限制了它的類型

⑨ java中泛型的使用

泛型可以避免強制類型轉換,設定集合對象中存儲的對象類型。
比如List<String> list = new ArrayList<String>();
那在這個list中,只能存儲字元串對象。

⑩ java 關於泛型以及通配符的使用

泛型可以用"<T>"代表,任意類型的。
解釋: 「<T>」是泛型的默認值,可以被任意類型所代替,如:
List<String> list = new ArayList<String>();這個就定義了一個String類型的」泛型「集合,那麼T的類型就是字元串。
List<T> list = new ArayList<T>();
可以賦值給list:list.add("StringBatch");
可以獲取到list的值:list.get(0),結果就是」StringBatch「;
這個時候T的類型也是String。也就是說T是動態的,可以被任意指定類型。

熱點內容
宜信宜人貸提供服務密碼是什麼 發布:2025-01-24 07:15:40 瀏覽:545
編程和引擎 發布:2025-01-24 07:14:19 瀏覽:621
landscapeandroid 發布:2025-01-24 07:11:09 瀏覽:968
如何進行隊伍配置 發布:2025-01-24 06:57:00 瀏覽:513
安卓線和華為線有什麼區別 發布:2025-01-24 06:56:57 瀏覽:976
oracle存儲過程傳入數組 發布:2025-01-24 06:49:26 瀏覽:718
密碼的前三個字是什麼 發布:2025-01-24 06:36:48 瀏覽:584
伺服器e3與e5有什麼區別 發布:2025-01-24 06:19:35 瀏覽:122
linuxdb2建資料庫 發布:2025-01-24 06:19:09 瀏覽:665
武漢長江存儲公司有多少人 發布:2025-01-24 06:09:03 瀏覽:413