亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

java泛型編程

2019-11-14 15:24:44
字體:
來源:轉載
供稿:網友

     一般的類和方法都是針對特定數據類型的,當寫一個對多種數據類型都適用的類和方法時就需要使用泛型編程,java的泛型編程類似于C++中的模板,即一種參數化類型的編程方法,具體地說就是將和數據類型相關的信息抽象出來,主要提供通用的實現和邏輯,和數據類型相關的信息由使用時參數決定

 

一.泛型類:

  • 棧的實現

示例代碼:

package com.genericity;import org.junit.Test;/*** @Title: LinkedListStack.java * @Package com.genericity * @Description: 編寫一個泛型棧(鏈表式)* @author lky * @date 2015年10月17日 下午8:34:07 * @version V1.0 */public class LinkedListStack<T> {        /**    * @Title: LinkedListStack.java     * @Package com.genericity     * @Description:定義棧中的節點類型    * @author lky     * @date 2015年10月17日 下午8:38:51     * @version V1.0     */    PRivate static class Node<U>{        U item;        Node<U> next;                Node(){            this.item=null;            this.next=null;        }        Node(U item,Node<U>next){            this.item=item;            this.next=next;        }                boolean isEmpty(){            return item==null && next==null;        }            }        private Node<T> top=new Node<T>();//棧頂指針        public void push(T item){  //入棧        top=new Node<T>(item,top);    }        public T pop(){    //出棧        T result=top.item;        if(!top.isEmpty()){            top=top.next;        }        return result;    }        }

測試:

package com.genericity;import org.junit.Test;public class testLinkedListStack {    @Test    public void testPush(){        LinkedListStack<String> aLinkedListStack=new LinkedListStack<String>();        aLinkedListStack.push("lky");        aLinkedListStack.push("aaaa");        String res=aLinkedListStack.pop();        while(res!=null){            System.out.println(res);            res=aLinkedListStack.pop();        }    }}

二.泛型方法:

package com.genericity;import java.util.ArrayList;import java.util.Date;import org.junit.Test;public class GenericMethods  {        /**    * @Title: getType     * @Description: 返回任意數組的數據類型    * @param item     */    public <T> String getType(T item){        return item.getClass().getName();    }        @Test    public void test(){        System.out.println(new GenericMethods().getType(new Date()));        System.out.println(new GenericMethods().getType(1));        System.out.println(new GenericMethods().getType("lky"));        System.out.println(new GenericMethods().getType(new ArrayList<String>()));    }}

三.泛型集合:

  1. java容器默認存放Object類型對象,如果一個容器中即存放有A類型對象,又存放有B類型對象,如果用戶將A對象和B對象類型弄混淆,則容易產生轉換錯誤,會發生類型轉換異常。
  2. 如果用戶不知道集合容器中元素的數據類型,同樣也可能會產生類型轉換異常。

     鑒于上述的問題,java5中引入了泛型機制,在定義集合容器對象時顯式指定其元素的數據類型,在使用集合容器時,編譯器會檢查數據類型是否和容器指定的數據類型相符合,如果不符合在無法編譯通過,從編譯器層面強制保證數據類型安全。

示例代碼:

package com.genericity;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Queue;import java.util.Set;import org.junit.Test;public class New {    public <k, v> Map<k, v> map() {        return new HashMap<k, v>();    }    public <T> List<T> list() {        return new ArrayList<T>();    }    public <T> LinkedList<T> linkList() {        return new LinkedList<T>();    }    public <T> Set<T> set() {        return new HashSet<T>();    }    public <T> Queue<T> queue() {        return new LinkedList<T>();    }        @Test    public void test(){        New new1=new New();        Map<String, LinkedList<String>> lisMap=new1.map();    }}
  • 數學中集合的實現

代碼實現:

package com.genericity;import java.util.HashSet;import java.util.Set;import org.junit.Test;public class Sets {        /**    * @Title: union     * @Description: 集合的并集    * @throws     */    public static <T> Set<T> union(Set<T> a,Set<T> b){        Set<T> set=new HashSet<T>(a);        set.addAll(b);        return set;    }        /**    * @Title: intersetion     * @Description: 集合交集     */    public static <T> Set<T> intersetion(Set<T>a,Set<T> b){        Set<T> set=new HashSet<T>(a);        set.retainAll(b);        return set;            }    /**    * @Title: difference     * @Description: 集合差集     */    public static <T> Set<T> difference(Set<T>a, Set<T> b){        Set<T> set=new HashSet<T>(a);        set.removeAll(b);        return set;    }        public static <T> Set<T> complement(Set<T>a,Set<T> b){       return  difference(union(a, b), intersetion(a, b));    }            @Test    public void test(){        HashSet<Integer> a=new HashSet<Integer>();        HashSet<Integer> b=new HashSet<Integer>();        for(int i=0;i<8;++i){            if(i<5)a.add(i);            if(i>2) b.add(i);         }                System.out.println(union(a, b).toString());        System.out.println(difference(a, b).toString());        System.out.println(intersetion(a, b).toString());        System.out.println(complement(a, b).toString());    }    }

四.泛型邊界

上邊界:

  • Java泛型編程中使用extends關鍵字指定泛型參數類型的上邊界,即泛型只能適用于extends關鍵字后面類或接口的子類。
  • Java泛型編程的邊界可以是多個,使用如<T extends A & B & C>語法來聲明,其中只能有一個是類,并且只能是extends后面的第一個為類,其他的均只能為接口(和類/接口中的extends意義不同)。
  • 使用了泛型邊界之后,泛型對象就可以使用邊界對象中公共的成員變量和方法。

下邊界:

  • 通過T Super A限制了T元素只能是A的父類。

五.泛型通配符

  • 泛型通配符”?”

一個比較經典泛型通配符的例子如下:

public class SampleClass < T extends S> {…}

假如A,B,C,…Z這26個class都實現了S接口。我們使用時需要使用到這26個class類型的泛型參數。那實例化的時候怎么辦呢?依次寫下

SampleClass<A> a = new SampleClass();

SampleClass<B> a = new SampleClass();

SampleClass<Z> a = new SampleClass();

這顯然很冗余,還不如使用Object而不使用泛型,使用通配符非常方便:

SampleClass<? Extends S> sc = newSampleClass();

六.無邊界的通配符

  • 泛型的通配符也可以不指定邊界,沒有邊界的通配符意思是不確定參數的類型,編譯時泛型檫除類型信息,認為是Object類型
  • List和List<?>的區別是:List是一個原始類型的List,它可以存放任何Object類型的對象,不需要編譯時類型檢查。List<?>等價于List<Object>,它不是一個原始類型的List,它存放一些特定類型,只是暫時還不確定是什么類型,需要編譯時類型檢查。因此List的效率要比List<?>高。
  • 具體講解見http://blog.csdn.net/chjttony/article/details/6801406

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久999精品视频| 欧洲美女7788成人免费视频| 国产精品久久久久91| 国产精品久久久久一区二区| 欧美小视频在线观看| 欧美中文字幕视频| 色无极亚洲影院| 91超碰中文字幕久久精品| 国产精品亚洲综合天堂夜夜| 在线电影欧美日韩一区二区私密| 激情成人中文字幕| 98午夜经典影视| 17婷婷久久www| 国产精品色午夜在线观看| 欧美乱妇高清无乱码| 亚洲人成网站在线播| 国产精品久久一区主播| 91久久在线播放| 国产成人精品综合久久久| 欧美极品美女视频网站在线观看免费| 国产精品一区二区av影院萌芽| 亚洲国产天堂久久综合网| 91欧美视频网站| 欧美在线观看一区二区三区| 尤物九九久久国产精品的分类| 色综合视频一区中文字幕| 国产精品狠色婷| 欧美一级电影久久| 国产精品福利片| 成人免费视频网址| 26uuu久久噜噜噜噜| 欧美日韩中文字幕日韩欧美| 国产精品啪视频| 成人免费网站在线看| 欧美一级高清免费播放| 国产成人亚洲综合青青| 欧美日韩不卡合集视频| 另类少妇人与禽zozz0性伦| 国产精品观看在线亚洲人成网| 国产有码在线一区二区视频| 不用播放器成人网| 欧美性高潮床叫视频| 日韩在线视频中文字幕| 亚洲国产日韩欧美在线动漫| 成人性生交大片免费看小说| 亚洲精品国产美女| 国产999精品| 欧美高跟鞋交xxxxxhd| 亚洲free性xxxx护士hd| 国产成人精品日本亚洲专区61| 欧美在线视频在线播放完整版免费观看| 久久欧美在线电影| 91网站免费观看| 最新69国产成人精品视频免费| 国语自产精品视频在线看| 丝袜美腿亚洲一区二区| 国产亚洲成精品久久| 日本一区二区在线播放| 中文字幕9999| 精品毛片三在线观看| 欧美黑人性猛交| 一色桃子一区二区| 亚洲激情在线观看视频免费| 上原亚衣av一区二区三区| 一区二区在线视频| 亚洲午夜激情免费视频| 亚洲精品视频播放| 欧美成人免费全部| 中文字幕亚洲欧美日韩高清| 色偷偷亚洲男人天堂| 欧美日韩国产成人在线观看| 欧美韩国理论所午夜片917电影| 久久久99久久精品女同性| 精品久久中文字幕久久av| 国产精品黄页免费高清在线观看| 久久免费视频这里只有精品| 欧美激情一区二区三级高清视频| 亚洲韩国日本中文字幕| 国产一区二区三区三区在线观看| 国产视频久久久| 精品国产精品自拍| 日韩在线视频免费观看高清中文| 国产成人小视频在线观看| 国产成人拍精品视频午夜网站| 亚洲第一福利视频| 亚洲精品在线视频| 久久久久久久久久久免费精品| 97人洗澡人人免费公开视频碰碰碰| 亚洲色无码播放| 亚洲女同性videos| 91日本在线视频| 亚洲美女av在线| 一区二区三区视频在线| 亚洲综合一区二区不卡| 精品日韩视频在线观看| 国产欧美 在线欧美| 国产亚洲精品久久久久久牛牛| 亚洲自拍偷拍在线| 两个人的视频www国产精品| 久久99精品久久久久久琪琪| 国产噜噜噜噜噜久久久久久久久| 啪一啪鲁一鲁2019在线视频| 秋霞av国产精品一区| 国内精品久久久久久中文字幕| 亚洲欧美日韩网| 91久久精品在线| 伦理中文字幕亚洲| 91夜夜未满十八勿入爽爽影院| 亚洲第一精品久久忘忧草社区| 日韩精品极品视频免费观看| 成人a免费视频| 日本一区二区在线播放| www.亚洲一二| 亚洲摸下面视频| 欧美一区二区三区精品电影| 欧美激情欧美狂野欧美精品| 国产精品户外野外| 欧美理论片在线观看| 亚洲国产精品福利| 麻豆国产精品va在线观看不卡| 亚洲欧美在线一区二区| 成人久久久久爱| 亚洲一区二区日本| 欧美性xxxx极品高清hd直播| 亚洲高清一区二| 国产日韩精品一区二区| 日韩大片免费观看视频播放| 亚洲理论片在线观看| 亚洲高清久久网| 在线日韩第一页| 91社区国产高清| 国自产精品手机在线观看视频| 国精产品一区一区三区有限在线| 欧美日韩成人精品| 欧美极品第一页| 第一福利永久视频精品| 亚洲欧美三级伦理| 久久99精品久久久久久噜噜| 欧美国产中文字幕| 欧美日韩国产精品| 成人黄色免费看| 欧美激情视频三区| 久久精品电影网站| 欧美资源在线观看| 狠狠躁18三区二区一区| 91中文精品字幕在线视频| 国产精品99蜜臀久久不卡二区| 欧美精品一区二区免费| 国产丝袜一区二区三区免费视频| 富二代精品短视频| 亚洲视频日韩精品| 亚洲一区二区三区成人在线视频精品| 91九色单男在线观看| 国产成人一区二区三区电影| 日韩在线视频网| 国产精品18久久久久久麻辣| 不卡在线观看电视剧完整版| 色黄久久久久久| 国产成人91久久精品| 国产丝袜视频一区| 日韩亚洲精品视频| 欧美日韩国产丝袜另类| 亚洲欧美国产制服动漫| 久久人人爽人人爽人人片av高清|