欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java進(jìn)階之泛型

泛型的優(yōu)點(diǎn)

  1. 泛型類型可以提高可靠性和可讀性
  2. 泛型可以參數(shù)化類型
  3. 泛型可以讓我們在編譯時(shí)而不是在運(yùn)行時(shí)檢測出錯(cuò)誤

泛型類或方法允許用戶指定可以和這些類或方法一起工作的對象類型(相容的對象)
泛型類ArrayList、泛型接口Comparable
從JDK1.5開始,Java允許定義泛型類、泛型接口、泛型方法

為前郭等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及前郭網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、前郭網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

泛型實(shí)例化

Java進(jìn)階之泛型
泛型就是限制對象的數(shù)據(jù)類型

泛型的正確使用

舉個(gè)栗子吧

創(chuàng)建一個(gè)存儲字符串的線性表(ArrayList)

ArrayList<String> list = new ArrayList<>();

現(xiàn)在就只能向該線性表中添加字符串

list.add("a");

如果試圖向其中添加非字符串類型,就會產(chǎn)生編譯錯(cuò)誤

list.add(new Person("張三",23));

當(dāng)沒有使用泛型時(shí),編譯通過,運(yùn)行也通過,即可以添加任何元素,但這樣做在遍歷元素進(jìn)行相關(guān)操作時(shí)會產(chǎn)生隱藏的bug。

?
泛型類型必須是引用數(shù)據(jù)類型,不能使用基本數(shù)據(jù)類型。

錯(cuò)誤示范
ArrayList<int> list = new ArrayList<>();
正確示范
ArrayList<Integer> list = new ArrayList<>();
list.add(5);      //自動裝箱

?
使用泛型對數(shù)據(jù)類型進(jìn)行限制后,無須類型轉(zhuǎn)換就可以從一個(gè)線性表中獲取一個(gè)值,因?yàn)榫幾g器已經(jīng)知道了這個(gè)元素的類型。

使用泛型前
ArrayList list = new ArrayList();
list.add("Jone");              //自動提升為Object類型
list.add("Smith");
String s = (String)(list.get(0));//將Object類型轉(zhuǎn)為String類型
使用泛型后
ArrayList<Double> list = new ArrayList<>();
list.add(5.5);          //5.5 is automatically converted to new Double(5.5)
list.add(3.0);          //3.0 is automatically converted to new Double(3.0)
Double doubleObject = list.get(0);  //No casting is needing
double d = list.get(1);             //Automatically converted to double

定義泛型類和接口

可以為類或者接口定義泛型。當(dāng)使用容器類來創(chuàng)建對象,或者使用容器類或接口來聲明引用變量時(shí),必須指定具體的類型。

利用ArrayList模擬堆棧結(jié)構(gòu),使用泛型對元素類型進(jìn)行限制

public class Stack<E>{
        //構(gòu)造方法
        public Stack(){}

        //創(chuàng)建數(shù)組列表,存儲元素的數(shù)據(jù)類型為E,需導(dǎo)包alt+shift+O
        private ArrayList<E> list = new ArrayList<>();

        //返回棧中的元素?cái)?shù)目
        public int getSize(){
                return list.size();
        }

        //返回棧頂元素
        public E peek(){
                return list.get(getSize() - 1);
        }

        //返回并移除棧頂元素
        public E pop(){
                E o = list.get(getSize() - 1);
                list.remove(getSize() - 1);
                return o;
        }

        //添加一個(gè)新元素到棧頂
        public void push(E o){
                list.add(o);
        }

        //如果棧為空,就返回true
        public boolean isEmpty(){
                return list.isEmpty();
        }

        @Override
              public String toString(){
                return "stack : " + list.toString();
        }
}

若使用LinkedList模擬堆棧結(jié)構(gòu),可以用getLast()、removeLast()、addLast()方法
上面自定義類的構(gòu)造方法不是public Stack<E>(){},而是public Stack(){}

泛型可能會有多個(gè)參數(shù),應(yīng)將所有參數(shù)一起放在尖括號中,并用逗號分隔開,比如<E1,E2,E3>
可以定義一個(gè)類或接口作為泛型類或者泛型接口的子類型
例如

public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence

泛型方法

可以為靜態(tài)方法定義泛型類型

public clas GenericMethodDemo{
        public static void main(String[] args){
                Integer[] integers = {1,2,3,4,5};
                String[] strings = {"London","Paris","New York","Austin"};

                GenericMethodDemo.<Integer>print(integers);
                GenericMethodDemo.<String>print(strings);
         }
         public static <E> void print(E[] list){
         for(int i = 0;i<list.length;i++){
                 System.out.print(list[i]+" ");
                 System.out.println();
        }
}

為了聲明泛型方法,將泛型類型<E>置于方法聲明中關(guān)鍵字static之后

public static <E> void print(E[] list)

為了調(diào)用泛型方法,需要將實(shí)際類型放在尖括號內(nèi)作為方法名的前綴。例如,

GenericMethodDemo.<Integer>print(integers);
GenericMethodDemo.<String>print(strings);

簡單調(diào)用

print(integers);
print(strings);

 

可以將泛型指定為另外一種類型的子類型,這樣的泛型類型稱為受限的。例如下面所示的代碼用以測試兩個(gè)幾何對象是否具有相同的面積。受限的泛型類型將E指定為GeometricObject的泛型子類型。此時(shí)必須傳遞兩個(gè)GeomericObject的實(shí)例來調(diào)用equalArea

public class BoundedTypeDemo{
    public static void main(String[] args){
        Rectangle rectangle = new Rectangle(2,2);
        Circle circle = new Circle(2);
        System.out.println("Same area?" + equalArea(rectangle,circle));
    }
    public static <E extends GeometricObject> boolean equalArea(
            E object1,E object2){
        return object1.getArea()==object2.getArea();
    }
}

非受限泛型類型<E>等同于<E extends Object>
為了定義一個(gè)類為泛型類型,需要將泛型類型放在類名之后,例如,GenericStack
為了定義一個(gè)方法為泛型類型,要將泛型類型放在方法返回類型之前,例如,void max(E o1,E o2)

網(wǎng)站欄目:Java進(jìn)階之泛型
分享URL:http://chinadenli.net/article42/gohoec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站營銷、服務(wù)器托管域名注冊、微信小程序企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化