国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

泛型分析

2019-11-06 06:28:02
字體:
供稿:網(wǎng)友

1、泛型入門

一、我們把一個(gè)對(duì)象丟進(jìn)集合里面,但是集合就會(huì)把該對(duì)象的類型忘記,取出這個(gè)集合的對(duì)象時(shí)就變成了object類型,泛型可以讓我們集合存儲(chǔ)特定的類型

看代碼

package test01;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/* * 使用泛型 */public class Ftest1 { public static void main(String[] args) { List list = new ArrayList(); list.add("woshishui"); list.add(1234); list.add("ef"); System.out.PRintln(list.get(1)); //int in1 = list.get(1); 不行要通過強(qiáng)制轉(zhuǎn)化,因?yàn)閬G進(jìn)去就成了Object類 int in = (int)list.get(1); //使用泛型 List<String> list2 = new ArrayList<String>();//只容許存放String類 //list2.add(Integer(1234)); 報(bào)錯(cuò),傳入不是String類 list2.add("1234"); System.out.println(list2.get(0)); //java7.0以后的泛型語(yǔ)法 List<String> list3 = new ArrayList<>(); //只能裝入一個(gè)String類和List類的對(duì)象,list類對(duì)象只能裝入String類 Map<String,List<String>> map1 = new HashMap<>(); List<String> strstring = new ArrayList<>(); strstring.add("第一個(gè)"); strstring.add("wwwww"); strstring.add("第二個(gè)"); strstring.add("QQqqq"); map1.put("n.1key", strstring); System.out.println(map1.get("n.1key")); for(String key:map1.keySet()) { //用一個(gè)循環(huán)輸出map List<String> lis = map1.get(key); System.out.println(key + "-->" +lis + " , "); } }}

二、有關(guān)泛型類和泛型類繼承:

看代碼與注釋:

package 有關(guān)帶有泛型的繼承;/* * 父類定義的泛型如果在子類時(shí)沒有確定泛型的類型,那么子類必須繼承過來,子類可以自己增加泛型 * 父類定義的泛型如果在子類實(shí)現(xiàn)那么,子類可自己定義或不定義泛型 * */class Apple<T> { T info; public Apple(){ System.out.println("沒有任何參數(shù)的Apple構(gòu)造函數(shù)"); } public Apple(T info) { this.info = info; System.out.println("帶有泛型參數(shù)的構(gòu)造函數(shù)"); } public Apple(String info){ //this.info = info; 不行,不知道屬性info是什么類型 System.out.println("普通帶參的構(gòu)造函數(shù)"); }}class B<T> extends Apple<T> { //父類沒有指定泛型是什么類型,子類必須繼承 public B(T info,String str) { //super(str); //子類的構(gòu)造器通過調(diào)用super 來調(diào)用父類的構(gòu)造器代碼 //super(info); 不能多次調(diào)用構(gòu)造器,原因是,super 只能寫在該代碼段第一行 }}class C<TT> extends Apple<String> {// 父類泛型類型確定子類可以自定義泛型或者不定義泛型 public C(String info){ //super(info);這行代碼不確定 調(diào)用的是哪個(gè)構(gòu)造函數(shù) }}public class test01 { public static void main(String[] args) { B b = new B(333,"rrr"); //C c = new C("ddd"); }}

泛型通配符:

package 通配符;import java.util.ArrayList;import java.util.List;/* * 1、通配符定義的泛型類型 list<?>, 表示list<?>是各種泛型list的父類,但是并不能把元素加入其中 * 2、但是不能在通配符定義的泛型類型里丟入對(duì)象,因?yàn)椴恢?lt;?>是什么類型空值可以被丟 * 3、在list<?>中取出對(duì)象時(shí),默認(rèn)是object類的對(duì)象,所以若要取出指定類型的對(duì)象就要強(qiáng)制轉(zhuǎn)化 * 4、通配符上限就是將傳進(jìn)集合的對(duì)象繼承一個(gè)父類,List<? extends Shape>,這樣子當(dāng)我們集合里面的對(duì)象拿出來時(shí)就不用強(qiáng)制轉(zhuǎn)化 * 5、在給泛型設(shè)置通配符上限的時(shí)候,我們傳的是一個(gè)設(shè)有上限的未知子類,所以不能向集合里面拋對(duì)象 * */public class test01 { public static void test(List<?> list){ for(int i=0;i<list.size();i++) { //list.add(111); 報(bào)錯(cuò) :The method add(int, capture#2-of ?) in the type List<capture#2-of ?> is not applicable for the arguments (int) //list.add(null);//空值可以 System.out.println(list.get(i)); Integer in = (Integer)list.get(i); //被默認(rèn)總是object要強(qiáng)制轉(zhuǎn)化 System.out.println(" in is :" + in); } } public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(123); list.add(234); list.add(345); test01.test(list); }}

通配符下限

package 通配符下限;import java.util.ArrayList;import java.util.Collection;import java.util.List;/* * */public class Test { public static <T> T copy2(Collection<? extends T> dest,Collection<T> src){ T last = null; for(T t:dest) { last = t; src.add(t); } return last; } /* * 最后一個(gè)形參傳入泛型 T=Integer ,所以第一個(gè)形參?super T ,?=Number */ public static <T> T copy3(Collection<? super T> from,Collection<T> to) { T test = null; for(T t:to) { from.add(t); } return test; } public static void main(String[] args) { List<Number> number = new ArrayList<>(); List<Integer> integer = new ArrayList<>(); //copy(number,integer); copy2(integer,number); copy3(number,integer); }}

菱形語(yǔ)法與泛型構(gòu)造器:

package 菱形語(yǔ)法泛型構(gòu)造器;/*知識(shí)點(diǎn)1、在調(diào)用構(gòu)造器時(shí)可以讓編譯器根據(jù)形參的值來推斷形參的類型 *知識(shí)點(diǎn)2、可顯式的讓用戶輸入形參類型 如:Myclass<Integer> ms3 = new <Double>Myclass<Integer>(6.3); * */ class Myclass<E> { public Myclass(Integer t) { //一號(hào)構(gòu)造 System.out.println(t); } public<T> Myclass( T t) { //二號(hào)構(gòu)造 System.out.println(t); }}public class TestFoo01 { public static void main(String[] args) { // Myclass<Integer> ms = new Myclass<>(99); //調(diào)用一號(hào)構(gòu)造 Myclass<Integer> ms2 = new Myclass<>("sss"); //調(diào)用二號(hào)構(gòu)造 /* * Myclass 中E的形參類型是Integer,如果顯示指定構(gòu)造器中T形參類型,那么菱形語(yǔ)法必須要傳入E形參類型 */ Myclass<Integer> ms3 = new <Double>Myclass<Integer>(6.3); }}

泛型方法:

package 泛型方法;/*知識(shí)點(diǎn)1、泛型方法主要是解決泛型形參的問題類似于形參 list<Collection>不是list<String>的父類 *知識(shí)點(diǎn)2、類型方法中定義的類型只能在該方法中有效 *知識(shí)點(diǎn)3、調(diào)用泛型方法和普通方法一樣 *知識(shí)點(diǎn)4、向泛型方法中傳入?yún)?shù)時(shí),不要讓系統(tǒng)不知道指定的是哪一個(gè)類型, * 一個(gè)方法的返回值類型依賴于另一個(gè)形參類型,那么使用泛型方法更好一點(diǎn) */import java.util.ArrayList;import java.util.Collection;import java.util.List;public class Test01 { // *知識(shí)點(diǎn)2、類型方法中定義的類型只能在該方法中有效 public static <T> void test(Collection<T> from,Collection<T> to){ for(T c:from) { to.add(c); } } public static <T> void test2(List<? extends T> from,List<T> to){ for(T c:from) { to.add(c); } } public static void main(String[] args) { List<String> list = new ArrayList<>(); List<String> list2 = new ArrayList<>(); test(list,list2); // *知識(shí)點(diǎn)3、調(diào)用泛型方法和普通方法一樣 //test(list,list2); List<Collection> list3 = new ArrayList<>(); List<String> list4 = new ArrayList<>(); //test01(list3,list4); 知識(shí)點(diǎn)4 系統(tǒng)識(shí)別出T的類型到底是什么 //test2(list4,list3); }}

擦除、轉(zhuǎn)換

package 擦除與轉(zhuǎn)換;/* * 當(dāng)一個(gè)具有泛型信息的對(duì)象賦值給另一個(gè)沒有泛型信息的變量時(shí),菱形語(yǔ)法擦除,比如List<String> 轉(zhuǎn)化成List,該 * List對(duì)集合元素的類型檢查變成類型變量的上限,再比如 List<T extends Number> 轉(zhuǎn)化成 List,則該List的對(duì)象 * 是上限 Number */class Apple<T extends Number> { T size; public Apple() { } public Apple(T size) { this.size = size; } public void getsize(T size) { this.size = size; } public T setsize() { return this.size; }}public class Test { public static void main(String[] args) { Apple<Integer> a = new Apple<>(123); Integer b = a.setsize(); //把菱形語(yǔ)法去除 沒有出現(xiàn)警告,擦除 Apple c = a; //賦值后 c 只知道 size 是Number 類型的 //Integer integer = c.setsize(); Number integer = c.setsize(); }}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 织金县| 乐昌市| 手游| 安阳市| 昌都县| 额济纳旗| 香港 | 罗江县| 庆城县| 张家港市| 凤凰县| 黔江区| 游戏| 乌兰浩特市| 永仁县| 怀宁县| 奎屯市| 雷州市| 伊宁市| 新晃| 保亭| 郴州市| 昂仁县| 内江市| 禄劝| 黄石市| 闽侯县| 隆林| 夹江县| 江西省| 栖霞市| 绥中县| 象山县| 嘉祥县| 汝城县| 临沭县| 九台市| 五常市| 潞城市| 中山市| 嘉禾县|