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中的泛型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑计算机配置在哪里打开(电脑计算机配置
- 下一篇: 19、java中枚举