日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

18、java中的泛型

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 18、java中的泛型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??????? 之前介紹集合時,可以看到有List<String>這樣的寫法,那么尖括號里的內容是什么呢?這是泛型,意思就是說聲明的這個List集合只能存放String類型的元素。

泛型是什么?

?????? ‘泛’指一般、不深入,在這里可以認為是不確定、可變的意思,java中允許定義一些不確定的類型,不可以是基本數據類型,但是在編譯時期一定要給與這些不確定類型一個確定的類型,這就是泛型,使用泛型可以提高代碼復用的效率。之前聽過一個小故事,兩個項目經理爭論接口中方法應該返回什么類型才合適,爭論好久都沒有結果,這時架構師過來說了句:“用泛型”,使得問題迎刃而解。泛型在java編程中還是很重要的。

?

為什么要用泛型?

?????? 一切為了方便和提高效率。當不確定要選擇何種類型時可以使用泛型,當使用到時再確定類型即可,另外使用泛型可以使得接口復用率提高,例如:List集合,List用到了泛型:List<E>,這樣便可以使得集合可以任意存儲各個類型的對象,使得List接口高度復用,可以假設一個場景,如果List沒有使用泛型,那么集合中存儲的數據就會五花八門,非常混亂,如果每存儲一種類型就去創建一個對應的List集合類,那么這是不可能的,而使用了泛型則這些問題統統被優雅的解決了。

?

泛型的特性?

?????? 一定要知道泛型只能在編譯時期使用,并且一定要在程序運行之前給予泛型類型一個確定的類型。

泛型怎么用?

???????? 泛型可以在接口、類和方法上使用,用于標記一個不確定的參數類型。接下來使用代碼來介紹泛型如何使用:

???????? 泛型接口和泛型類的使用(實例化時最好時確定類型):

package com.czp.generic; //可以這樣實現,此時實現類上必須也要加上泛型 public class SelfInterfaceImpl<T> implements SelfInterface<T>{T t;@Overridepublic T getObject(int i) {return t;} }class Test{public static void main(String[] args) {//當創建帶有泛型參數的對象時,如果還不確定泛型的具體類型,則一概為Object類型;實例化時一定要確定類型SelfInterface selfInterface = new SelfInterfaceImpl<>();Object object = selfInterface.getObject(1);//返回為Object型//確定泛型類型為StringSelfInterface<String> selfInterface2 = new SelfInterfaceImpl<>();String string = selfInterface2.getObject(1);//返回為定義的類型//確定泛型類型為IntegerSelfInterface<Integer> selfInterface3 = new SelfInterfaceImpl<>();Integer integer = selfInterface3.getObject(1);//返回為定義的類型}}

泛型方法的使用:

public class SelfMethodTest {public static void main(String[] args) throws InstantiationException, IllegalAccessException {SelfMethodTest test = new SelfMethodTest();Object name = test.getName(ArrayList.class);String []s = {"111","222","333","444"};test.showThings(s);}//使用<T>來定義泛型方法//這里想來想去也只有反射這里用的泛型方法比較好,根據傳入的運行時類對象確定類public <T> T getName(Class c) throws InstantiationException, IllegalAccessException {T t = (T)c.newInstance();if (t.getClass().isAssignableFrom(ArrayList.class)) {System.out.println("類型符合");}return t;}//這里順便說一下可變參數,當傳入的形參太多時,則可以使用一個數組進行傳參,但是呢,樣式做了改變 int ...i 表示的是傳入一個int類型的數組i作為形參//有的時候不能確定參數的類型,可以使用泛型,如下public void showThings(int ...i) {}//此時是泛型數組,所以傳參數時,數組一定要確定類型public <T> void showThings(T ...t) {for (T tt : t) {System.out.println(tt);}} }

有的時候會看到如下這種方式的泛型的表示:

??????????????? public void showThings(List<?> list)

??????????????? public void showThings(List<? extends Map> list)

???????? 那么這里的問號是什么呢?我們把問號叫做通配符。List<?> list 表示可以接受任何類型的List集合,而List<? extends Map> list 則表示只能接受繼承或者實現了了Map接口的接口或類。有的時候就是想要限制傳入的參數的類型,例如:我就想接受一個Map或者Map擴展類的參數,其余的不想接收,這時候就可以使用<? extends Map>這種形式進行聲明;還有一種時<? super Map> ,他表示的是必須是Map或者Map的父級接口類型。

總結

以上是生活随笔為你收集整理的18、java中的泛型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。