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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乡县| 荣成市| 凌云县| 土默特右旗| 武汉市| 锡林浩特市| 太康县| 正阳县| 蓝田县| 林西县| 韶关市| 江津市| 新津县| 广安市| 巩留县| 顺平县| 阿克陶县| 广平县| 朝阳市| 健康| 秭归县| 准格尔旗| 卓资县| 莱西市| 石柱| 蓬溪县| 台江县| 德惠市| 镇平县| 额敏县| 伽师县| 商洛市| 左权县| 五大连池市| 乌什县| 郸城县| 河南省| 高清| 洱源县| 麟游县| 麟游县|