小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

java泛型

 Mis林桑 2017-03-14

泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。 Java語(yǔ)言引入泛型的好處是安全簡(jiǎn)單。在Java SE 1.5之前,沒有泛型的情況的下,通過對(duì)類型Object的引用來實(shí)現(xiàn)參數(shù)的“任意化”,“任意化”帶來的缺點(diǎn)是要做顯式的強(qiáng)制類型轉(zhuǎn)換,而這種轉(zhuǎn)換是要求開發(fā)者對(duì)實(shí)際參數(shù)類型可以預(yù)知的情況下進(jìn)行的。對(duì)于強(qiáng)制類型轉(zhuǎn)換錯(cuò)誤的情況,編譯器可能不提示錯(cuò)誤,在運(yùn)行的時(shí)候才出現(xiàn)異常,這是一個(gè)安全隱患。泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的,以提高代碼的重用率。

基本信息

  • 英文名:Java generics
  • 中文名:Java泛型
  • 應(yīng)用學(xué)科:計(jì)算機(jī)軟件
  • 軟件語(yǔ)言:Java
  • 適用版本:Java SE 1.5以上
相關(guān)搜索
java范型
java反射
java泛型方法
java泛型聲明方式

介紹

JAVA正在加載JAVA

在JAVA SE 1.5之前,沒有泛型的情況的下,通過對(duì)類型Object的引用來實(shí)現(xiàn)參數(shù)的“任意化”,“任意化”帶來的缺點(diǎn)是要做顯式的強(qiáng)制類型轉(zhuǎn)換,而這種轉(zhuǎn)換是要求開發(fā)者對(duì)實(shí)際參數(shù)類型可以預(yù)知的情況下進(jìn)行的。對(duì)于強(qiáng)制類型轉(zhuǎn)換錯(cuò)誤的情況,編譯器可能不提示錯(cuò)誤,在運(yùn)行的時(shí)候才出現(xiàn)異常,這是一個(gè)安全隱患。

泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的,提高代碼的重用率。

規(guī)則和限制

1、泛型的類型參數(shù)只能是類類型(包括自定義類),不能是簡(jiǎn)單類型。

2、同一種泛型可以對(duì)應(yīng)多個(gè)版本(因?yàn)閰?shù)類型是不確定的),不同版本的泛型類實(shí)例是不兼容的。

3、泛型的類型參數(shù)可以有多個(gè)。

4、泛型的參數(shù)類型可以使用extends語(yǔ)句,例如。習(xí)慣上稱為“有界類型”。

5、泛型的參數(shù)類型還可以是通配符類型。例如Class classType = Class.forName('java.lang.String');

泛型還有接口、方法等等,內(nèi)容很多,需要花費(fèi)一番功夫才能理解掌握并熟練應(yīng)用。在此給出我曾經(jīng)了解泛型時(shí)候?qū)懗龅膬蓚€(gè)例子(根據(jù)看的印象寫的),實(shí)現(xiàn)同樣的功能,一個(gè)使用了泛型,一個(gè)沒有使用,通過對(duì)比,可以很快學(xué)會(huì)泛型的應(yīng)用,學(xué)會(huì)這個(gè)基本上學(xué)會(huì)了泛型70%的內(nèi)容。

例子一:使用了泛型

class Gen {

private T ob; //定義泛型成員變量

public Gen(T ob) {

this.ob = ob;

}

public T getOb() {

return ob;

}

public void setOb(T ob) {

this.ob = ob;

}

public void showType() {

System.out.println('T的實(shí)際類型是: ' + ob.getClass().getName());

}

}

public class GenDemo {

public static void main(String[] args){

//定義泛型類Gen的一個(gè)Integer版本

Gen intOb=new Gen(88);

intOb.showType();

int i= intOb.getOb();

System.out.println('value= ' + i);

System.out.println('----------------------------------');

//定義泛型類Gen的一個(gè)String版本

Gen strOb=new Gen('Hello Gen!');

strOb.showType();

String s=strOb.getOb();

System.out.println('value= ' + s);

}

}

例子二:沒有使用泛型

public class Gen2 {

private Object ob; //定義一個(gè)通用類型成員

public Gen2(Object ob) {

this.ob = ob;

}

public Object getOb() {

return ob;

}

public void setOb(Object ob) {

this.ob = ob;

}

public void showTyep() {

System.out.println('T的實(shí)際類型是: ' + ob.getClass().getName());

}

}

public class GenDemo2 {

public static void main(String[] args) {

//定義類Gen2的一個(gè)Integer版本

Gen2 intOb = new Gen2(new Integer(88));

intOb.showTyep();

int i = (Integer) intOb.getOb();

System.out.println('value= ' + i);

System.out.println('---------------------------------');

//定義類Gen2的一個(gè)String版本

Gen2 strOb = new Gen2('Hello Gen!');

strOb.showTyep();

String s = (String) strOb.getOb();

System.out.println('value= ' + s);

}

}

運(yùn)行結(jié)果:

兩個(gè)例子運(yùn)行Demo結(jié)果是相同的,控制臺(tái)輸出結(jié)果如下:

T的實(shí)際類型是:

java.lang.Integer

value= 88

----------------------------------

T的實(shí)際類型是: java.lang.String

value= Hello Gen!

Process finished with exit code 0

看明白這個(gè),以后基本的泛型應(yīng)用和代碼閱讀就不成問題了。

逐漸深入泛型

1、沒有任何重構(gòu)的原始代碼

有兩個(gè)類如下,要構(gòu)造兩個(gè)類的對(duì)象,并打印出各自的成員x。

public class StringFoo {

private String x;

public StringFoo(String x) {

this.x = x;

}

public String getX() {

return x;

}

public void setX(String x) {

this.x = x;

}

}

public class DoubleFoo {

private Double x;

public DoubleFoo(Double x) {

this.x = x;

}

public Double getX() {

return x;

}

public void setX(Double x) {

this.x = x;

}

}

以上的代碼實(shí)在無聊,就不寫如何實(shí)現(xiàn)了。

2、對(duì)上面的兩個(gè)類進(jìn)行重構(gòu),寫成一個(gè)類

因?yàn)樯厦娴念愔?,成員和方法的邏輯都一樣,就是類型不一樣,因此考慮重構(gòu)。Object是所有類的父類,因此可以考慮用Object做為成員類型,這樣就可以實(shí)現(xiàn)通用了,實(shí)際上就是“Object泛型”,暫時(shí)這么稱呼。

public class ObjectFoo {

private Object x;

public ObjectFoo(Object x) {

this.x = x;

}

public Object getX() {

return x;

}

public void setX(Object x) {

this.x = x;

}

}

寫出Demo方法如下:

public class ObjectFooDemo {

public static void main(String args[]) {

ObjectFoo strFoo = new ObjectFoo(new StringFoo('Hello Generics!'));

ObjectFoo douFoo = new ObjectFoo(new DoubleFoo(Double('33')));

ObjectFoo objFoo = new ObjectFoo(new Object());

System.out.println('strFoo.getX='+(StringFoo)strFoo.getX());

System.out.println('douFoo.getX='+(DoubleFoo)douFoo.getX());

System.out.println('objFoo.getX='+objFoo.getX());

}

}

運(yùn)行結(jié)果如下:

strFoo.getX=Hello Generics!

douFoo.getX=33.0

objFoo.getX=java.lang.Object@19821f

解說:在Java 5之前,為了讓類有通用性,往往將參數(shù)類型、返回類型設(shè)置為Object類型,當(dāng)獲取這些返回類型來使用時(shí)候,必須將其“強(qiáng)制”轉(zhuǎn)換為原有的類型或者接口,然后才可以調(diào)用對(duì)象上的方法。

3、Java1.5泛型來實(shí)現(xiàn)

強(qiáng)制類型轉(zhuǎn)換很麻煩,我還要事先知道各個(gè)Object具體類型是什么,才能做出正確轉(zhuǎn)換。否則,要是轉(zhuǎn)換的類型不對(duì),比如將“Hello Generics!”字符串強(qiáng)制轉(zhuǎn)換為Double,那么編譯的時(shí)候不會(huì)報(bào)錯(cuò),可是運(yùn)行的時(shí)候就掛了。那有沒有不強(qiáng)制轉(zhuǎn)換的辦法----有,改用 Java5泛型來實(shí)現(xiàn)。

public class GenericsFoo {

private T x;

public GenericsFoo(T x) {

this.x = x;

}

public T getX() {

return x;

}

public void setX(T x) {

this.x = x;

}

}

public class GenericsFooDemo {

public static void main(String args[]){

GenericsFoo strFoo=new GenericsFoo('Hello Generics!');

GenericsFoo douFoo=new GenericsFoo(new Double('33'));

GenericsFoo

System.out.println('strFoo.getX='+strFoo.getX());

System.out.println('douFoo.getX='+douFoo.getX());

System.out.println('objFoo.getX='+objFoo.getX());

}

}

運(yùn)行結(jié)果:

strFoo.getX=Hello Generics!

douFoo.getX=33.0

objFoo.getX=java.lang.Object@19821f

和使用“Object泛型”方式實(shí)現(xiàn)結(jié)果的完全一樣,但是這個(gè)Demo簡(jiǎn)單多了,里面沒有強(qiáng)制類型轉(zhuǎn)換信息。

下面解釋一下上面泛型類的語(yǔ)法:

使用來聲明一個(gè)類型持有者名稱,然后就可以把T當(dāng)作一個(gè)類型代表來聲明成員、參數(shù)和返回值類型。

當(dāng)然T僅僅是個(gè)名字,這個(gè)名字可以自行定義。

class GenericsFoo 聲明了一個(gè)泛型類,這個(gè)T沒有任何限制,實(shí)際上相當(dāng)于Object類型,實(shí)際上相當(dāng)于 class GenericsFoo。

與Object泛型類相比,使用泛型所定義的類在聲明和構(gòu)造實(shí)例的時(shí)候,可以使用“<實(shí)際類型>”來一并指定泛型類型持有者的真實(shí)類型。類如

GenericsFoo douFoo=new GenericsFoo(new Double('33'));

當(dāng)然,也可以在構(gòu)造對(duì)象的時(shí)候不使用尖括號(hào)指定泛型類型的真實(shí)類型,但是你在使用該對(duì)象的時(shí)候,就需要強(qiáng)制轉(zhuǎn)換了。比如:GenericsFoo douFoo=new GenericsFoo(new Double('33'));

實(shí)際上,當(dāng)構(gòu)造對(duì)象時(shí)不指定類型信息的時(shí)候,默認(rèn)會(huì)使用Object類型,這也是要強(qiáng)制轉(zhuǎn)換的原因。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多