Java梳理之理解泛型

在之前的文章中分析過(guò)了多態(tài)省古,可以知道多態(tài)本身是一種泛化機(jī)制,它通過(guò)基類或者接口來(lái)設(shè)計(jì)份乒,使程序擁有一定的靈活性杀怠,但是這種通過(guò)基類或者接口實(shí)現(xiàn)的靈活性對(duì)程序來(lái)說(shuō)約束性還是太強(qiáng)了椰憋。我們總是希望編寫(xiě)出更加通用的代碼,而不是限于某個(gè)基類或者接口驮肉,所以在java5是推出了泛型的概念熏矿。

泛型類型

泛型術(shù)語(yǔ)的意思是“適用于許多的類型”,它的目的是希望類和方法可以具備最廣泛的表達(dá)能力离钝。個(gè)人認(rèn)為可以從通用程序和持有對(duì)象兩個(gè)方面來(lái)理解泛型票编,就像在書(shū)寫(xiě)的代碼時(shí),程序很有可能會(huì)要求我們持有一些對(duì)象卵渴,這些對(duì)象并沒(méi)有固定指哪一個(gè)類型慧域,在缺失泛型的情況下,我們有幾種設(shè)計(jì)方法浪读,比如使用多態(tài)性昔榴、或者直接持有一個(gè)Object對(duì)象、又或者選擇一一針對(duì)來(lái)設(shè)計(jì)這個(gè)程序碘橘,很明顯互订,多態(tài)性的限制在基類或者接口上,Object對(duì)象雖然也能達(dá)到效果卻很不安全痘拆,而一一對(duì)應(yīng)則會(huì)產(chǎn)生極多的重復(fù)代碼仰禽,在java1.5之后,我們可以通過(guò)泛型來(lái)優(yōu)雅的設(shè)計(jì)出滿足需求的程序纺蛆。

就像編寫(xiě)一個(gè)容器類我們希望它可以被特化為包含任何特定種類的對(duì)象吐葵,并且對(duì)于每個(gè)隊(duì)列對(duì)象,我們都可以定義它要保存對(duì)象類型桥氏。如下所示:

/**
***泛型示例
**/
class Generic<T>{
    private T type;
    public Generic(T type){
        this.type = type;
    }
    public T getType() {
        return type;
    }
    public void setType(T type) {
        this.type = type;
    }
}

這個(gè)類Generic<T>的聲明就是泛型聲明温峭,表示Generic<T>是一個(gè)泛型類,其中T就是那個(gè)我們可以定義的保存的類型字支,被稱為類型變量凤藏。類型變量可以用單個(gè)字母來(lái)命名如:E指的元素Element奸忽,K指的鍵keyV指的值value清笨,T指的類型Type月杉。
創(chuàng)建的這個(gè)對(duì)象的時(shí)候則需要告訴編譯器我們制定的類型T刃跛,如:Generic<String> strCell = new Generic<String>("hello");抠艾、Generic<Integer> intCell = new Generic<Integer>();
可以看到對(duì)于兩個(gè)引用strCellintCell我們指定了兩個(gè)不同的類型StringInteger桨昙,但是兩個(gè)引用的類型其實(shí)是一樣的检号,如下所示:

public static void main(String[] arrg0){
        Generic<String> strCell = new Generic<String>("hello");
        Generic<Integer> intCell = new Generic<Integer>(0);
        boolean same = strCell.getClass() == intCell.getClass();
        System.out.println("--same = "+same);
        
}
輸出:
--same = true

這是因?yàn)榉盒偷念愋蛥?shù)只是聲明了要被構(gòu)造的對(duì)象信息,使得編譯器可以檢查輸入的類型是否正確蛙酪,編譯器會(huì)使用最泛化的對(duì)象(通常是Object)來(lái)表示類型參數(shù)齐苛,然后適用強(qiáng)制裝換保證程序的正確性,所以運(yùn)行期的對(duì)象沒(méi)有類型參數(shù)的信息桂塞。因?yàn)樽允贾两K都只是這一個(gè)類Generic被定義凹蜂,,所以調(diào)用靜態(tài)方法的時(shí)候時(shí)沒(méi)有T的類型信息的阁危,即如果存在類型參數(shù)T的泛型類玛痊,在它的內(nèi)部不能將T用在靜態(tài)區(qū)域,
如靜態(tài)字段狂打,靜態(tài)方法擂煞,靜態(tài)代碼塊中
。這個(gè)結(jié)論也指出了類型參數(shù)的使用范圍:可以出現(xiàn)在放置具體類名的非靜態(tài)的聲明中趴乡,如字段聲明对省,方法返回類型,參數(shù)列表晾捏,局部變量蒿涎,嵌套類型聲明,除了創(chuàng)建類型E或者數(shù)組T[]惦辛。
對(duì)于不能創(chuàng)建具體的對(duì)象或數(shù)組對(duì)象劳秋,和不能擁有類型為T(mén)的靜態(tài)字段是同一個(gè)道理,單一的類只有單一的toArray定義裙品,編譯器必須在編譯期確定將要?jiǎng)?chuàng)建那些類型對(duì)象或數(shù)組的代碼俗批,但是我們并不知道T具體是什么類型,只靠Generic類是無(wú)法完成這個(gè)功能的市怎。如果非要在其中創(chuàng)建這個(gè)對(duì)象或數(shù)組岁忘,可以考慮用反射機(jī)制來(lái)實(shí)現(xiàn),這部分后面會(huì)有提到区匠。

邊界

Generic<T>中干像,雖然類型參數(shù)T可以指定任何想要的引用類型帅腌,但是,有時(shí)候我們也需要為參數(shù)類型定義某些限制麻汰,例如:

class SortedCollection<T extends Comparable<T>>{
    /**
     * method in here
     */
}

在這個(gè)類中速客,T extends Comparable<T>表明我們需要傳入的類型參數(shù)需要實(shí)現(xiàn)Comparable接口,不然類內(nèi)部的使用了compareTo方法的地方可能出錯(cuò)或者無(wú)法達(dá)到我們預(yù)期的效果五鲫。其中Comparable接口為T的上界溺职,T則是一個(gè)有界的類型參數(shù)。這里解釋一下這個(gè)extends位喂,這里并不單單表示繼承浪耘,它擴(kuò)展為繼承,實(shí)現(xiàn)的意思塑崖。在《Java程序設(shè)計(jì)語(yǔ)言》中的原話有寫(xiě)道:類型邊界可以通過(guò)以下方式來(lái)表示這樣的多重依賴關(guān)系:聲明類型參數(shù)擴(kuò)展了一個(gè)類或接口七冲,并在后面跟隨一個(gè)由&分隔的其他必須實(shí)現(xiàn)的接口的列表

既然有泛型類规婆,那么就會(huì)涉及到內(nèi)部類的問(wèn)題澜躺,比如一個(gè)類中嵌套了一個(gè)泛型類型,那么會(huì)有什么特別的地方么抒蚜?這種情況就是嵌套泛型類型了掘鄙。

嵌套泛型類型

就像在之前梳理的內(nèi)部類中,嵌套一個(gè)泛型類型也有幾種情況削锰,如普通內(nèi)部泛型類通铲、靜態(tài)內(nèi)部泛型類、匿名內(nèi)部泛型類器贩。這里靜態(tài)內(nèi)部泛型類也會(huì)存在一個(gè)問(wèn)題颅夺,代碼如下:

class Generic<T>{
    private InnerClass<T> inner; 
    public InnerClass<T> getInner(){
        return inner;
    }
    static class InnerClass<T>{
        private T name;
        public T getName(){
            return name;
        }
        public void setName(T name){
            this.name = name;
        }
    }
}

在上面這部分代碼中,泛型類作為一個(gè)靜態(tài)類被嵌套在Generic類中蛹稍,這里需要注意的是外部的Generic<T>和內(nèi)部的InnerClass<T>中吧黄,兩個(gè)類型T的意義是不一樣的,雖然說(shuō)都只是用了相同的字母T表示唆姐,很簡(jiǎn)單的道理拗慨,因?yàn)殪o態(tài)內(nèi)部類不需要外部類對(duì)象的引用就可以直接創(chuàng)建對(duì)象,所以這個(gè)InnerClass<T>中的類型跟外圍類中的類型T并不關(guān)聯(lián)奉芦。
這里提一下赵抢,如果兩個(gè)類型不一樣,那么盡量不要用一樣的類型T來(lái)代表声功。其他的內(nèi)部泛型類因?yàn)橐蕾囉谕鈬惖囊梅橙矗吹故菦](méi)有這個(gè)問(wèn)題,因?yàn)樵谕獠恳呀?jīng)有聲明為泛型類型之后先巴,內(nèi)部類是可以訪問(wèn)到這個(gè)作用字段的其爵。

使用泛型類型

使用泛型類型的時(shí)候冒冬,我們需要為類型參數(shù)指定我們需要的類型,例如上面的Generic<String> generic = new Generic<String>();,我們?yōu)轭愋蛥?shù)T指定的類型就是String摩渺。同理简烤,如果有多個(gè)類型參數(shù),那么就需要為每一個(gè)類型參數(shù)指定一個(gè)類型摇幻『嵴欤看起來(lái)這是個(gè)很容易的問(wèn)題,就像剛剛指定的String類型一樣囚企,符合我們使用要求就好了丈咐,但是考慮到繼承機(jī)制瑞眼,比如我們指定的類型T是父類如Number龙宏,那么另一個(gè)指定為它的子類Integer的泛型類型能不能代入父類Number指定的程序中呢?

public static double count(ArrayList<Number> numberList){
        double count = 0;
        for(Number num :numberList){
            count += num.doubleValue(); 
        }
        return count;
}

這這個(gè)方法中伤疙,我們需要傳入一個(gè)ArrayList<Number>類型的參數(shù)银酗,在代碼中試一下ArrayList<Integer>可以看到會(huì)報(bào)錯(cuò),提示:The method count(ArrayList<Number>) in the type GenericDemo is not applicable for the arguments (ArrayList<Integer>)徒像。這就說(shuō)明泛型類型中指定的類型T只是代表了T類型的泛型類型黍特,和它的子類是沒(méi)有關(guān)系的,即ArrayList<Integer>并不是ArrayList<Number>的子類型锯蛀,這和數(shù)組不一樣灭衷,數(shù)組中Integer[]Number[]的子類型。那么又有問(wèn)題了旁涤,如果我們程序中有需要這樣一個(gè)Number的子類怎么辦翔曲?
這里就需要引入一個(gè)概念,即通配符“?”劈愚,通過(guò)通配符就可以很好的完成我們的設(shè)計(jì)瞳遍,就像上面的方法,我們只需要修改一下就可以適用于ArrayList<Integer>,代碼如下:

public static double count(ArrayList<? extends Number> numberList){
        double count = 0;
        for(Number num :numberList){
            count += num.doubleValue(); 
        }
        return count;
}

在這里菌羽,通配符表示我們可以使用任意的類型掠械,只要它是Number或者它的子類,這里的? extends Number 表示以Number為上界的任意類型注祖,包括Number本身猾蒂。既然有上界,對(duì)應(yīng)的還有一個(gè)下界是晨,即? super Integer表示所有Integer的超類或者接口肚菠。看到這里署鸡,可能會(huì)自然的和有界類型變量相比較案糙,需要注意的是通配符只能存在一個(gè)上界或下界限嫌,但是有界泛型類型是可以有多個(gè)上界的,而且類型參數(shù)是沒(méi)有下界的时捌,例如不能聲明成這樣T super String怒医。在這里一開(kāi)始就使用了邊界,所以可能會(huì)下意識(shí)的以為通配符必須要有邊界奢讨,其實(shí)不然稚叹,
通配符也可以無(wú)界,即直接使用?拿诸,隱式的代表是上界為Object對(duì)象扒袖,即ArrayList<? extends Object>∧堵耄可以看出通配符是泛型中很重要的一點(diǎn)季率,它可以使泛型有效的使用,但是通配符本身還是存在局限性:因?yàn)橥ㄅ浞硎镜氖俏粗臄?shù)據(jù)類型描沟,那么就無(wú)法使用在已知的數(shù)據(jù)類型的時(shí)候飒泻。例如:

ArrayList<?> list = new ArrayList<String>();
list.add("test");
ArrayList<? extends Number> list1 = new ArrayList<Integer>();
list1.add(1);

在上面的代碼中我為list添加了一個(gè)test字符串,但是編譯器會(huì)提示錯(cuò)誤:The method add(capture#1-of ?) in the type ArrayList<capture#1-of ?> is not applicable for the arguments (String)吏廉。而list1.add(1)這里泞遗,可能會(huì)有人很疑惑,明明加進(jìn)去的是屬于Number類型的席覆,為什么還是不行史辙?這是因?yàn)樵谑褂梅盒蜁r(shí),編譯器和運(yùn)行時(shí)系統(tǒng)都不知道你想用的類型是什么佩伤,我們不能把傳入的Number或它的子類泛化成Number聊倔。這其實(shí)是合理的,因?yàn)閭鬟M(jìn)來(lái)的是未知類型,我們無(wú)法把一個(gè)未知類型轉(zhuǎn)成已知的畦戒。不同的是如果是下界有指定方库,那么它是正確的,如下所示:

ArrayList<? super Integer> list1 = new ArrayList<Number>();
list1.add(1);

它會(huì)把傳入的類型保存為Integer障斋。雖然通配符本身表示的是未知類型纵潦,但是一旦使用了之后,編譯器會(huì)把它當(dāng)做一個(gè)具有某種具體類型的變量來(lái)處理垃环,以便編譯器檢查對(duì)他的使用是否正確邀层。這個(gè)未知的具體類型被稱為通配符的捕獲。盡管捕獲可以被當(dāng)做任意類型遂庄,但是不能將通配符類型傳遞給擁有類型變量定義參數(shù)列表的方法中寥院。
雖然通常情況下,我們不希望在使用了List<T>的地方出現(xiàn)List<?>涛目,因?yàn)檫@個(gè)通配符代表的類型和類型參數(shù)代表的類型兼容性未知秸谢。但是有一條規(guī)則可以允許被捕獲的通配符被表示為未知的類型變量T凛澎,即捕獲轉(zhuǎn)換。捕獲轉(zhuǎn)換無(wú)法被應(yīng)用于類型參數(shù)被多個(gè)方法使用的情況估蹄。只有當(dāng)類型變量被定義在頂層泛型類型才可以使用捕獲轉(zhuǎn)換塑煎。最后,我們無(wú)法再任何需要知道通配符類型的地方使用通配符引用臭蚁。

說(shuō)完了泛型類型最铁,接下來(lái)可以看看泛型接口。

泛型接口

和普通的接口類似垮兑,泛型接口本質(zhì)上還是屬于接口冷尉,只是在接口中使用的類型需要在實(shí)際使用中進(jìn)行指定,即當(dāng)一個(gè)類實(shí)現(xiàn)了這個(gè)泛型接口,那么需要為泛型接口指定具體類型,代碼如下:

class Generic implements IGeneric<String>{

    @Override
    public String get(String name) {
        // TODO Auto-generated method stub
        return null;
    }
    
}
interface IGeneric<T>{
    T get(String name);
}

在類Generic實(shí)現(xiàn)接口Igeneric<T>的同時(shí)头谜,為它指定了一個(gè)類型參數(shù)String就可以正常的使用這個(gè)接口了。

目前為止震束,我們看到的泛型都是在類層次上的,現(xiàn)在我們可以看看泛型方法当犯。

泛型方法

在一個(gè)類的內(nèi)部可以定義很多方法,通常情況下我們都會(huì)為方法的參數(shù)列表指定具體的類型割疾,其實(shí)也可以使用泛型嚎卫,將這個(gè)方法的通用型達(dá)到最大,在《Thinking in Java》中的原話是這樣說(shuō)的:無(wú)論何時(shí)宏榕,只要你能做到拓诸,你就應(yīng)該盡量使用泛型方法,這句話說(shuō)明了麻昼,如果可以考泛型方法解決的問(wèn)題奠支,那么就不要使用泛型類,而且對(duì)于一個(gè)靜態(tài)方法而言抚芦,它是無(wú)法訪問(wèn)泛型類內(nèi)部的類型參數(shù)的倍谜,就可以使用泛型方法來(lái)解決泛型的問(wèn)題。例如:

class Generic{
    public static <T> T get(T t){
        return t;
    }
}

在類Generic中的方法get是一個(gè)泛型方法叉抡,它根據(jù)用戶輸入的類型不同而返回不同類型的引用尔崔,實(shí)際使用的時(shí)候,通常也不需要像泛型類一樣指定輸入的類型參數(shù)褥民,編譯器會(huì)自動(dòng)幫我們找到具體的類型季春,即類型參數(shù)推斷。如果把Generic定義成泛型的消返,那么這個(gè)靜態(tài)方法反而無(wú)法獲取類型參數(shù)的信息载弄。當(dāng)然咯耘拇,并不是泛型類和泛型方法兩者是互斥的,它們是可以同時(shí)存在的宇攻。
在這里驼鞭,如果在方法中添加的是基本數(shù)據(jù)類型,編譯器會(huì)自動(dòng)打包成它的包裝類尺碰。

看了這幾部分,下面說(shuō)一下泛型機(jī)制:擦除

擦除:

我們說(shuō)過(guò)很多次挣棕,無(wú)論泛型類型中可以形成多少種參數(shù)化類型,每一個(gè)泛型類型都只有一個(gè)類亲桥。就好像Generic<T>洛心,泛型類型在被擦除后就只剩下一個(gè)不加任何修飾的類名,如Generic题篷,即原始類型词身。類型參數(shù)的擦除就是它的第一個(gè)邊界,如E的擦除是它隱式的上界Object番枚。編譯器通過(guò)擦除為泛型類型生成一個(gè)類定義法严,當(dāng)使用類型參數(shù)的時(shí)候,如果它和通過(guò)擦除生成的類型不一致葫笼,編譯器就會(huì)插入一個(gè)強(qiáng)制類型轉(zhuǎn)換來(lái)保證安全性深啤。由于基礎(chǔ)數(shù)據(jù)類型不是對(duì)象類型,所以在泛型中無(wú)法使用基礎(chǔ)數(shù)據(jù)類型路星,如果有需要可以使用它的包裝類型溯街。
擦除大體會(huì)在兩個(gè)方面影響我們:
1.運(yùn)行時(shí)擦除
任何在運(yùn)行時(shí)需要知道引用具體的類型都是不允許的,這帶來(lái)的影響主要有一下幾點(diǎn):
不能創(chuàng)建類型參數(shù)的實(shí)例或者數(shù)組洋丐。
不能創(chuàng)建元素類型是參數(shù)化類型的數(shù)組呈昔,除非用于該參數(shù)化類型的所有引元都是無(wú)界通配符。
不能使用instanceof來(lái)查看類型參數(shù)是否是哪個(gè)實(shí)體類型友绝,除非該參數(shù)化類型的所有引元是無(wú)界通配符堤尾。
涉及到類型參數(shù)的強(qiáng)制轉(zhuǎn)換都會(huì)被替換成它的擦除的強(qiáng)制轉(zhuǎn)換。
catch子句不能捕獲由類型參數(shù)表示的異常
泛型類不允許直接或間接的擴(kuò)展Throwable
不能在類字面常量的表示中使用泛型類型迁客,即不能使用Generic<String>.class郭宝。
2.重載和覆蓋
過(guò)去我們隊(duì)重載的定義是具有相同名字不同簽名的方法,而覆蓋則是在子類中可以訪問(wèn)到的和超類具有相同名字和相同簽名的方法哲泊。但是在涉及泛型的時(shí)候剩蟀,這些概念需要修改一下,相同的簽名則變成相同數(shù)量的類型變量,且相同的類型變量的邊界一樣切威。下面考慮一下覆蓋育特,
我們要做的是覆蓋等價(jià)的簽名,而不是要求相同的簽名,即 當(dāng)兩個(gè)方法的簽名相同時(shí)缰冤,或他們的擦除相同時(shí)犬缨,才具有等價(jià)性。如果在一個(gè)類或接口中棉浸,有兩個(gè)方法它的簽名具有等價(jià)性怀薛,并且名字相同則會(huì)報(bào)錯(cuò),套用到子類中迷郑,則是如果兩個(gè)簽名等價(jià)枝恋,名字相同的方法就會(huì)隱式的覆蓋父類的方法。

可以看到嗡害,最后一部分并沒(méi)有例子附上焚碌,只扔了一些理論和結(jié)論在這里,如果有興趣霸妹,可以自己思考一下每一點(diǎn)為什么是這樣的十电。個(gè)人而言,其實(shí)也有些不懂的地方叹螟,文中有錯(cuò)誤的地方請(qǐng)幫忙指正鹃骂,,萬(wàn)分感謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罢绽,一起剝皮案震驚了整個(gè)濱河市畏线,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌有缆,老刑警劉巖象踊,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異棚壁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)栈虚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)袖外,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人魂务,你說(shuō)我怎么就攤上這事曼验。” “怎么了粘姜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鬓照,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我孤紧,道長(zhǎng)豺裆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮臭猜,結(jié)果婚禮上躺酒,老公的妹妹穿的比我還像新娘。我一直安慰自己蔑歌,他們只是感情好羹应,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著次屠,像睡著了一般园匹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劫灶,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天裸违,我揣著相機(jī)與錄音,去河邊找鬼浑此。 笑死累颂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凛俱。 我是一名探鬼主播紊馏,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒲犬!你這毒婦竟也來(lái)了朱监?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤原叮,失蹤者是張志新(化名)和其女友劉穎赫编,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奋隶,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂送,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唯欣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘹吨。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖境氢,靈堂內(nèi)的尸體忽然破棺而出蟀拷,到底是詐尸還是另有隱情,我是刑警寧澤萍聊,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布问芬,位于F島的核電站,受9級(jí)特大地震影響寿桨,放射性物質(zhì)發(fā)生泄漏此衅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炕柔。 院中可真熱鬧酌泰,春花似錦、人聲如沸匕累。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欢嘿。三九已至衰琐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炼蹦,已是汗流浹背羡宙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掐隐,地道東北人狗热。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虑省,于是被迫代替她去往敵國(guó)和親匿刮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 泛型的意思就是參數(shù)化類型探颈,通過(guò)使用參數(shù)化類型創(chuàng)建的接口熟丸、類、方法伪节,可以指定所操作的數(shù)據(jù)類型光羞。比如:可以使用參...
    零度沸騰_yjz閱讀 3,311評(píng)論 1 15
  • object 變量可指向任何類的實(shí)例,這讓你能夠創(chuàng)建可對(duì)任何數(shù)據(jù)類型進(jìn)程處理的類怀大。然而纱兑,這種方法存在幾個(gè)嚴(yán)重的問(wèn)題...
    CarlDonitz閱讀 913評(píng)論 0 5
  • 開(kāi)發(fā)人員在使用泛型的時(shí)候,很容易根據(jù)自己的直覺(jué)而犯一些錯(cuò)誤化借。比如一個(gè)方法如果接收List作為形式參數(shù)萍启,那么如果嘗試...
    時(shí)待吾閱讀 1,055評(píng)論 0 3
  • 從來(lái)沒(méi)有想過(guò),人的一生可以這么沒(méi)有羈絆的行走屏鳍。沒(méi)有了物質(zhì)欲的渴望,所有的一切都出自于精神的需求和與生俱來(lái)的本能局服。 ...
    一只特立獨(dú)行的魚(yú)兒閱讀 755評(píng)論 1 9
  • 2017年秋天的開(kāi)始钓瞭,人生又一個(gè)十年。 收到朋友們發(fā)來(lái)祝福淫奔,滿滿的感動(dòng)與感慨山涡,每年的今天他們的祝福從來(lái)都不會(huì)遲到。...
    虹霖_703閱讀 277評(píng)論 0 2