真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java進(jìn)階之泛型-創(chuàng)新互聯(lián)

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

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

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

成都創(chuàng)新互聯(lián)專(zhuān)注于曹縣企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站制作。曹縣網(wǎng)站建設(shè)公司,為曹縣等地區(qū)提供建站服務(wù)。全流程按需制作網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

泛型實(shí)例化

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

泛型的正確使用

舉個(gè)栗子吧

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

ArrayList list = new ArrayList<>();

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

list.add("a");

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

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

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


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

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

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

使用泛型前
ArrayList list = new ArrayList();
list.add("Jone");              //自動(dòng)提升為Object類(lèi)型
list.add("Smith");
String s = (String)(list.get(0));//將Object類(lèi)型轉(zhuǎn)為String類(lèi)型
使用泛型后
ArrayList 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

定義泛型類(lèi)和接口

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

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

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

        //創(chuàng)建數(shù)組列表,存儲(chǔ)元素的數(shù)據(jù)類(lèi)型為E,需導(dǎo)包alt+shift+O
        private ArrayList 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()方法
上面自定義類(lèi)的構(gòu)造方法不是public Stack(){},而是public Stack(){}

泛型可能會(huì)有多個(gè)參數(shù),應(yīng)將所有參數(shù)一起放在尖括號(hào)中,并用逗號(hào)分隔開(kāi),比如
可以定義一個(gè)類(lèi)或接口作為泛型類(lèi)或者泛型接口的子類(lèi)型
例如

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

泛型方法

可以為靜態(tài)方法定義泛型類(lè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.print(integers);
                GenericMethodDemo.print(strings);
         }
         public static  void print(E[] list){
         for(int i = 0;i

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

public static  void print(E[] list)

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

GenericMethodDemo.print(integers);
GenericMethodDemo.print(strings);

簡(jiǎn)單調(diào)用

print(integers);
print(strings);

可以將泛型指定為另外一種類(lèi)型的子類(lèi)型,這樣的泛型類(lèi)型稱(chēng)為受限的。例如下面所示的代碼用以測(cè)試兩個(gè)幾何對(duì)象是否具有相同的面積。受限的泛型類(lèi)型將E指定為GeometricObject的泛型子類(lèi)型。此時(shí)必須傳遞兩個(gè)GeomericObject的實(shí)例來(lái)調(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  boolean equalArea(
            E object1,E object2){
        return object1.getArea()==object2.getArea();
    }
}

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。


文章標(biāo)題:Java進(jìn)階之泛型-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/dhejsj.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部