java簡明例舉講解泛型
什么是泛型
早期的Object類型可以接收任意的對象類型,但是在實際的使用中, 會有類型轉換的問題。也就存在這隱患,所以Java提供了泛型來解決這個安全問題
泛型,即“參數(shù)化類型”。一提到參數(shù),最熟悉的就是定義方法時有形參,然后調(diào)用此方法時傳
遞實參。就是說 , 我們可以將類型向參數(shù)一樣傳遞過去
//一個泛型類 //T可以為任意字符,如A,a,B等都可以 public class Demo1<T> { private T num; public Demo1() {} public Demo1(T num) { this.num = num; } public void setNum(T num) { this.num = num; } public static void main(String[] args) { Demo1<Integer> demo1 = new Demo1<>(101); } }
如上 , 實際傳入時需指明傳入的實際類型 , 此處為Integer(泛型不能為int等基本類型,只能為引用類型) , 如果不指明則默認為object型
當然也可以定義多個泛型
public class Demo1<T,A> { }
泛型類與接口派生子類
此處我們定義一個Demo2類繼承上面的Demo1 類
可以看到 ,這樣顯然是不行的 , 那么此處有兩種解決辦法
1. 指明父類泛型的具體類型 ,如 :
public class Demo2 extends Demo1<Integer>{ }
2. 子類也是泛型類, 如 :
public class Demo2<T> extends Demo1<T>{ }
子類也是泛型類,子類和父類的泛型類型要一致
子類不是泛型類,父類要明確泛型的數(shù)據(jù)類型
泛型接口與泛型類的定義及使用基本相同。
泛型通配符
相信很多人都見過這種寫法
? 是什么意思呢 , 接著我們來解釋
? 代表類型通配符 , 代表傳入實參時 , 可以傳入為任意類型
例如, 上述demo1 中 new對象也可以這樣寫
Demo1<?> demo1 = new Demo1<>(101);
? 只能代表傳入的具體實參 , 類上面的是形參,所以?只能具體傳入時使用, ? 表示實際傳入的參數(shù)類型可以是任意的
類型通配符上限 :
類/接口<?extends 實參類型>
// ? extends Number public static void method(Demo1<? extends Number> demo1){ } public static void main(String[] args) { method(new Demo1<Integer>()); }
如上 , 我們在method() 中傳入的參數(shù)是上述定義的Demo1類類型 , ? extends Number的意思就是說我們實際傳入的類型上限是 Number , 也就是說, 只有Number 和 Number的子類(此處傳入為Integer , Number是Integer的父類)被實際傳入才是合法的
類型通配符下限 :
類/ 接口 < ? super 實參類型 >
了解了上限 , 那么下限這里也就不難理解了 , 就是傳入的必須是 自己或者自己的父類
public static void method1(Demo1<? super Number> demo1){ } public static void main(String[] args) { method1(new Demo1<Object>()); }
此處必須傳入Number 或者 Number的父類 (此處傳入為Object類)
類型擦除
泛型是Java 1.5版本才引進的概念,在這之前是沒有泛型的,但是,泛型代碼能夠很 好地和之前版本的代碼兼容。那是因為,泛到信息只存在于代碼編譯階段,在進入JVM之前,與泛型相關的信息會被擦除掉,我們稱之為一類型擦除. 泛型類被類型擦除后,相應的類型就被替換成 Object 類型或者上限類型.
就是說 , 泛型只存在于編譯期期間 , 真正執(zhí)行代碼的時候 , 是沒有泛型這個概念的, 它只是在編譯期對我們傳入的類型做了約束
到此這篇關于java簡明例舉講解泛型的文章就介紹到這了,更多相關java泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java實現(xiàn)AOP功能的封裝與配置的小框架實例代碼
這篇文章主要介紹了Java實現(xiàn)AOP功能的封裝與配置的小框架實例代碼,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02解決spring @ControllerAdvice處理異常無法正確匹配自定義異常
這篇文章主要介紹了解決spring @ControllerAdvice處理異常無法正確匹配自定義異常的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java中new Date().getTime()指定時區(qū)的時間戳問題小結
本文主要介紹了Java中new Date().getTime()時間戳問題小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07java中jdbcTemplate的queryForList(坑)
本文主要介紹了java中jdbcTemplate的queryForList,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09SpringData @Query和@Modifying注解原理解析
這篇文章主要介紹了SpringData @Query和@Modifying注解原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08Java實現(xiàn)多線程大批量同步數(shù)據(jù)(分頁)
這篇文章主要為大家詳細介紹了Java實現(xiàn)多線程大批量同步數(shù)據(jù)(分頁),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08