摘要:前言從今天開始進入基礎的復習,可能一個星期會有一篇的十道簡單算法,我寫博文的未必都是正確的如果有寫錯的地方請大家多多包涵并指正今天要復習的是泛型,泛型在中也是個很重要的知識點,本文主要講解基礎的概念,并不是高深的知識,如果基礎好的同學可以當
前言
從今天開始進入Java基礎的復習,可能一個星期會有一篇的<十道簡單算法>,我寫博文的未必都是正確的~如果有寫錯的地方請大家多多包涵并指正~
今天要復習的是泛型,泛型在Java中也是個很重要的知識點,本文主要講解基礎的概念,并不是高深的知識,如果基礎好的同學可以當復習看看~
一、什么是泛型?Java泛型設計原則:只要在編譯時期沒有出現警告,那么運行時期就不會出現ClassCastException異常.
泛型:把類型明確的工作推遲到創建對象或調用方法的時候才去明確的特殊的類型
參數化類型:
把類型當作是參數一樣傳遞
<數據類型> 只能是引用類型
相關術語:
ArrayList
ArrayList
整個稱為ArrayList
整個ArrayList
早期Java是使用Object來代表任意類型的,但是向下轉型有強轉的問題,這樣程序就不太安全
首先,我們來試想一下:沒有泛型,集合會怎么樣
Collection、Map集合對元素的類型是沒有任何限制的。本來我的Collection集合裝載的是全部的Dog對象,但是外邊把Cat對象存儲到集合中,是沒有任何語法錯誤的。
把對象扔進集合中,集合是不知道元素的類型是什么的,僅僅知道是Object。因此在get()的時候,返回的是Object。外邊獲取該對象,還需要強制轉換
有了泛型以后:
代碼更加簡潔【不用強制轉換】
程序更加健壯【只要編譯時期沒有警告,那么運行時期就不會出現ClassCastException異常】
可讀性和穩定性【在編寫集合的時候,就限定了類型】
2.1有了泛型后使用增強for遍歷集合在創建集合的時候,我們明確了集合的類型了,所以我們可以使用增強for來遍歷集合!
//創建集合對象 ArrayList三、泛型基礎 3.1泛型類list = new ArrayList<>(); list.add("hello"); list.add("world"); list.add("java"); //遍歷,由于明確了類型.我們可以增強for for (String s : list) { System.out.println(s); }
泛型類就是把泛型定義在類上,用戶使用該類的時候,才把類型明確下來....這樣的話,用戶明確了什么類型,該類就代表著什么類型...用戶在使用的時候就不用擔心強轉的問題,運行時轉換異常的問題了。
在類上定義的泛型,在類的方法中也可以使用!
/* 1:把泛型定義在類上 2:類型變量定義在類上,方法中也可以使用 */ public class ObjectTool{ private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } }
測試代碼:
用戶想要使用哪種類型,就在創建的時候指定類型。使用的時候,該類就會自動轉換成用戶想要使用的類型了。
public static void main(String[] args) { //創建對象并指定元素類型 ObjectTool3.2泛型方法tool = new ObjectTool<>(); tool.setObj(new String("鐘福成")); String s = tool.getObj(); System.out.println(s); //創建對象并指定元素類型 ObjectTool objectTool = new ObjectTool<>(); /** * 如果我在這個對象里傳入的是String類型的,它在編譯時期就通過不了了. */ objectTool.setObj(10); int i = objectTool.getObj(); System.out.println(i); }
前面已經介紹了泛型類了,在類上定義的泛型,在方法中也可以使用.....
現在呢,我們可能就僅僅在某一個方法上需要使用泛型....外界僅僅是關心該方法,不關心類其他的屬性...這樣的話,我們在整個類上定義泛型,未免就有些大題小作了。
定義泛型方法....泛型是先定義后使用的
//定義泛型方法.. publicvoid show(T t) { System.out.println(t); }
測試代碼:
用戶傳遞進來的是什么類型,返回值就是什么類型了
public static void main(String[] args) { //創建對象 ObjectTool tool = new ObjectTool(); //調用方法,傳入的參數是什么類型,返回值就是什么類型 tool.show("hello"); tool.show(12); tool.show(12.5); }3.3泛型類派生出的子類
前面我們已經定義了泛型類,泛型類是擁有泛型這個特性的類,它本質上還是一個Java類,那么它就可以被繼承
那它是怎么被繼承的呢??這里分兩種情況
子類明確泛型類的類型參數變量
子類不明確泛型類的類型參數變量
3.3.1子類明確泛型類的類型參數變量泛型接口
/* 把泛型定義在接口上 */ public interface Inter{ public abstract void show(T t); }
實現泛型接口的類.....
/** * 子類明確泛型類的類型參數變量: */ public class InterImpl implements Inter3.3.2子類不明確泛型類的類型參數變量{ @Override public void show(String s) { System.out.println(s); } }
當子類不明確泛型類的類型參數變量時,外界使用子類的時候,也需要傳遞類型參數變量進來,在實現類上需要定義出類型參數變量
/** * 子類不明確泛型類的類型參數變量: * 實現類也要定義出類型的 * */ public class InterImpl implements Inter { @Override public void show(T t) { System.out.println(t); } }
測試代碼:
public static void main(String[] args) { //測試第一種情況 //Interi = new InterImpl(); //i.show("hello"); //第二種情況測試 Inter ii = new InterImpl<>(); ii.show("100"); }
值得注意的是:
實現類的要是重寫父類的方法,返回值的類型是要和父類一樣的!
類上聲明的泛形只對非靜態成員有效
3.4類型通配符為什么需要類型通配符????我們來看一個需求.......
現在有個需求:方法接收一個集合參數,遍歷集合并把集合元素打印出來,怎么辦?
按照我們沒有學習泛型之前,我們可能會這樣做:
public void test(List list){ for(int i=0;i上面的代碼是正確的,只不過在編譯的時候會出現警告,說沒有確定集合元素的類型....這樣是不優雅的...
那我們學習了泛型了,現在要怎么做呢??有的人可能會這樣做:
public void test(List
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68891.html
摘要:往期第一課體驗第二課基礎類型和入門高級類型第三課泛型第四課解讀高級類型插一課本來打算接著上節課把高級類型都講完但是寫著寫著我發現高級類型中有很多地方都需要泛型的知識那么先插一節泛型什么是類型變量和泛型變量的概念我們都知道可以表示任意數據類型 往期 第一課, 體驗typescript 第二課, 基礎類型和入門高級類型 第三課, 泛型 第四課, 解讀高級類型 插一課 本來打算接著上節課, ...
摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...
摘要:然而中的泛型使用了類型擦除,所以只是偽泛型。總結本文介紹了泛型的使用,以及類型擦除相關的問題。一般情況下泛型的使用比較簡單,但是某些情況下,尤其是自己編寫使用泛型的類或者方法時要注意類型擦除的問題。 簡介 Java 在 1.5 引入了泛型機制,泛型本質是參數化類型,也就是說變量的類型是一個參數,在使用時再指定為具體類型。泛型可以用于類、接口、方法,通過使用泛型可以使代碼更簡單、安全。然...
摘要:首先,我們來按照泛型的標準重新設計一下類。注意參數為而不是泛型。利用形式的通配符,可以實現泛型的向上轉型,來看例子。需要注意的是,無法從這樣類型的中取出數據。showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac3bf3eb16160c); 00、故事的起源 二哥,要不我上大學的時候也學習編程吧?有一天,三妹突發奇想地問我。 你確定要做一名...
閱讀 3400·2021-10-08 10:15
閱讀 5440·2021-09-23 11:56
閱讀 1467·2019-08-30 15:55
閱讀 445·2019-08-29 16:05
閱讀 2725·2019-08-29 12:34
閱讀 2036·2019-08-29 12:18
閱讀 914·2019-08-26 12:02
閱讀 1650·2019-08-26 12:00