获取list泛型_泛型
泛型
什么是泛型?為什么使用泛型?
泛型的出現(xiàn)意味著編寫的代碼可以被不同類型的對(duì)象所重用,提升了代碼的重用性。泛型的本質(zhì)是參數(shù)化類型,即將所需操作的數(shù)據(jù)類型設(shè)置為一個(gè)參數(shù)。 舉個(gè)實(shí)際中的栗子:我們需要設(shè)計(jì)一個(gè)柜子的類,柜子可以用于存放書本、食品或者衣物,但是我們?cè)谠O(shè)計(jì)階段不能確定柜子里具體要存放什么東西,那怎么來設(shè)計(jì)這樣一個(gè)通用型的柜子,這里就可以用到泛型。所以,我們把存放元素的類型設(shè)計(jì)成一個(gè)參數(shù),這個(gè)類型參數(shù)就稱之為泛型。 舉個(gè)JAVA中的栗子:ArrayList,List,這個(gè)就是類型參數(shù),也就是泛型。為什么這么寫呢?因?yàn)槲覀冊(cè)趧?chuàng)建Arraylist或者List時(shí),無法確定里面具體存儲(chǔ)的元素的類型,但是我們有希望一個(gè)實(shí)例對(duì)象中存儲(chǔ)的元素的類型時(shí)一致的,這就需要泛型來實(shí)現(xiàn)操作。
int[] arr1 = new int[] {159,357,456};//沒有用泛型,ArrayList中存儲(chǔ)的元素格式各樣,實(shí)際開發(fā)中在操作時(shí)是很容易出現(xiàn)問題的List list1 = new ArrayList();list1.add(123);list1.add("敲代碼的阿茄");list1.add(arr1);//使用泛型,限制ArrayList存放的元素的類型,就不能添加存儲(chǔ)其他類型的元素了List<String> list2 = new ArrayList<>();list2.add("敲");list2.add("代");list2.add("碼");list2.add("的");list2.add("阿");list2.add("茄");//list2.add(123);//無法添加//list2.add(arr1);//無法添加泛型使用的基本要求
- 異常類不能聲明為泛型。
- 泛型不能是基本數(shù)據(jù)類型,需要使用基本數(shù)據(jù)類型的泛型可以寫成其包裝類。
自定義泛型類
在類或接口中聲明的泛型,可以作為非靜態(tài)屬性的類型、非靜態(tài)方法的參數(shù)類型、非靜態(tài)方法的返回值。但是,不能在靜態(tài)方法中使用類的泛型。
// 泛型類:類中定義有不確定的類型public class Dict<T> {String dictName;int dictCount;T dictT;//泛型類下用了泛型的方法,報(bào)錯(cuò),需要去掉static//public static void get(T dictT) {// this.dictT = dictT;//}//泛型類下沒用泛型的方法public static void set() {System.out.println("");}}泛型方法和泛型類下的方法?
泛型方法:該泛型方法所在的類可以不是泛型類。往直觀一點(diǎn)講,方法中出現(xiàn)了泛型結(jié)構(gòu)<>。 那么,泛型方法可以是靜態(tài)的嗎?可以,因?yàn)榉盒蛥?shù)是在調(diào)用方法時(shí)確定的,并非在實(shí)例化時(shí)確定的。
public class GenericTest {public static void main(String[] args) {Dict<Float> dict = new Dict<>();dict.set1(0.0f);//調(diào)用泛型方法,泛型類型跟類的泛型沒關(guān)系,不受影響dict.set2(" ");dict.set2(36);dict.set2(new ArrayList());}}//泛型類class Dict<T> {String dictName;int dictCount;//泛型類中的方法:如果調(diào)用了泛型則不能為靜態(tài)public void set1(T dictT) {System.out.println("我是泛型類下的方法");}//泛型方法:可以為靜態(tài)public static <T> void set2(T dictT) {System.out.println("我是泛型方法");}}泛型與繼承
- 如果類A是類B的父類,但是,G<A>不是G<B> 的父類(G是類或者接口),兩個(gè)屬于不同的類。所以不存在兩者間的多態(tài)和向上轉(zhuǎn)型。
- 但是呢,A<G>仍然是B<G>的父類。
通配符
通配符:?
- 利用通配符,創(chuàng)建二者的共同父類,G<A>和G<B>的共同父類G<?>;
- 但是,不能往其中添加新數(shù)據(jù),常用于賦值操作而已,僅能添加null;
- 允許讀取數(shù)據(jù),讀取數(shù)據(jù)的類型為object;
舉例說明:定義List<?>是List<Object>和List<String>的公共父類。
//不能添加數(shù)據(jù),除了nullList<?> list = new ArrayList<>();//list.add(16);//報(bào)錯(cuò)//list.add(" ");//報(bào)錯(cuò)list.add(null);//允許讀取數(shù)據(jù)List<?> list = new ArrayList<>();List<String> list1 = new ArrayList<>();list1.add("newstring");list =list1;list.add(null);Object obj = list.get(0);System.out.println(obj);//newstring有限制條件的通配符
- G<? extends A>可以作為G<A>和G<B>的父類,其中B是A的子類;即,可以作為所有繼承于A類的類G<A的子類>的父類。
- G<? super A>可以作為G<A>和G<B>的父類,其中B是A的父類;即,可以作為所有A的父類的G<A的父類>的父類。
總結(jié)
以上是生活随笔為你收集整理的获取list泛型_泛型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 撸串是淄博的美食吗?
- 下一篇: 当我不再依赖你的时候说说_不要依赖任何人