Java基礎(chǔ)-泛型

轉(zhuǎn)載自segmentfault博主Java3y的原創(chuàng)文章
原文鏈接:https://segmentfault.com/a/1190000014120746

前言

從今天開(kāi)始進(jìn)入Java基礎(chǔ)的復(fù)習(xí),可能一個(gè)星期會(huì)有一篇的<十道簡(jiǎn)單算法>媳板,我寫(xiě)博文的未必都是正確的~如果有寫(xiě)錯(cuò)的地方請(qǐng)大家多多包涵并指正~

今天要復(fù)習(xí)的是泛型,泛型在Java中也是個(gè)很重要的知識(shí)點(diǎn)糯累,本文主要講解基礎(chǔ)的概念,并不是高深的知識(shí)逾条,如果基礎(chǔ)好的同學(xué)可以當(dāng)復(fù)習(xí)看看~

一指么、什么是泛型?

Java泛型設(shè)計(jì)原則:只要在編譯時(shí)期沒(méi)有出現(xiàn)警告瞎饲,那么運(yùn)行時(shí)期就不會(huì)出現(xiàn)ClassCastException異常.

泛型:把類(lèi)型明確的工作推遲到創(chuàng)建對(duì)象或調(diào)用方法的時(shí)候才去明確的特殊的類(lèi)型

參數(shù)化類(lèi)型:

  • 把類(lèi)型當(dāng)作是參數(shù)一樣傳遞

  • <數(shù)據(jù)類(lèi)型> 只能是引用類(lèi)型

相關(guān)術(shù)語(yǔ):

  • ArrayList中的E稱(chēng)為類(lèi)型參數(shù)變量

  • ArrayList中的Integer稱(chēng)為實(shí)際類(lèi)型參數(shù)

  • 整個(gè)稱(chēng)為ArrayList泛型類(lèi)型

  • 整個(gè)ArrayList稱(chēng)為參數(shù)化的類(lèi)型ParameterizedType

二、為什么需要泛型

早期Java是使用Object來(lái)代表任意類(lèi)型的炼绘,但是向下轉(zhuǎn)型有強(qiáng)轉(zhuǎn)的問(wèn)題嗅战,這樣程序就不太安全

首先,我們來(lái)試想一下:沒(méi)有泛型俺亮,集合會(huì)怎么樣

  • Collection驮捍、Map集合對(duì)元素的類(lèi)型是沒(méi)有任何限制的。本來(lái)我的Collection集合裝載的是全部的Dog對(duì)象脚曾,但是外邊把Cat對(duì)象存儲(chǔ)到集合中东且,是沒(méi)有任何語(yǔ)法錯(cuò)誤的。

  • 把對(duì)象扔進(jìn)集合中本讥,集合是不知道元素的類(lèi)型是什么的珊泳,僅僅知道是Object。因此在get()的時(shí)候拷沸,返回的是Object色查。外邊獲取該對(duì)象,還需要強(qiáng)制轉(zhuǎn)換

有了泛型以后:

  • 代碼更加簡(jiǎn)潔【不用強(qiáng)制轉(zhuǎn)換】

  • 程序更加健壯【只要編譯時(shí)期沒(méi)有警告撞芍,那么運(yùn)行時(shí)期就不會(huì)出現(xiàn)ClassCastException異逞砹耍】

  • 可讀性和穩(wěn)定性【在編寫(xiě)集合的時(shí)候,就限定了類(lèi)型】

2.1有了泛型后使用增強(qiáng)for遍歷集合

在創(chuàng)建集合的時(shí)候序无,我們明確了集合的類(lèi)型了验毡,所以我們可以使用增強(qiáng)for來(lái)遍歷集合衡创!

//創(chuàng)建集合對(duì)象
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");
//遍歷,由于明確了類(lèi)型.我們可以增強(qiáng)for
for (String s : list) {
    System.out.println(s);
}

三、泛型基礎(chǔ)

3.1泛型類(lèi)

泛型類(lèi)就是把泛型定義在類(lèi)上晶通,用戶(hù)使用該類(lèi)的時(shí)候钧汹,才把類(lèi)型明確下來(lái)....這樣的話,用戶(hù)明確了什么類(lèi)型录择,該類(lèi)就代表著什么類(lèi)型...用戶(hù)在使用的時(shí)候就不用擔(dān)心強(qiáng)轉(zhuǎn)的問(wèn)題,運(yùn)行時(shí)轉(zhuǎn)換異常的問(wèn)題了碗降。

  • 在類(lèi)上定義的泛型隘竭,在類(lèi)的方法中也可以使用!
/*
 1:把泛型定義在類(lèi)上
 2:類(lèi)型變量定義在類(lèi)上,方法中也可以使用
*/
public class ObjectTool<T> {
    private T obj;
    public T getObj() {
        return obj;
    }
    public void setObj(T obj) {
        this.obj = obj;
    }
}
  • 測(cè)試代碼:

用戶(hù)想要使用哪種類(lèi)型讼渊,就在創(chuàng)建的時(shí)候指定類(lèi)型动看。使用的時(shí)候,該類(lèi)就會(huì)自動(dòng)轉(zhuǎn)換成用戶(hù)想要使用的類(lèi)型了爪幻。

public static void main(String[] args) {
    //創(chuàng)建對(duì)象并指定元素類(lèi)型
    ObjectTool<String> tool = new ObjectTool<>();
    tool.setObj(new String("鐘福成"));
    String s = tool.getObj();
    System.out.println(s);
    //創(chuàng)建對(duì)象并指定元素類(lèi)型
    ObjectTool<Integer> objectTool = new ObjectTool<>();
    /**
     * 如果我在這個(gè)對(duì)象里傳入的是String類(lèi)型的,它在編譯時(shí)期就通過(guò)不了了.
     */
    objectTool.setObj(10);
    int i = objectTool.getObj();
    System.out.println(i);
}

3.2泛型方法

前面已經(jīng)介紹了泛型類(lèi)了菱皆,在類(lèi)上定義的泛型,在方法中也可以使用.....

現(xiàn)在呢挨稿,我們可能就僅僅在某一個(gè)方法上需要使用泛型....外界僅僅是關(guān)心該方法仇轻,不關(guān)心類(lèi)其他的屬性...這樣的話,我們?cè)谡麄€(gè)類(lèi)上定義泛型奶甘,未免就有些大題小作了篷店。

  • 定義泛型方法....泛型是先定義后使用的
//定義泛型方法..
public <T> void show(T t) {
    System.out.println(t);
}
  • 測(cè)試代碼:

用戶(hù)傳遞進(jìn)來(lái)的是什么類(lèi)型,返回值就是什么類(lèi)型了

public static void main(String[] args) {
    //創(chuàng)建對(duì)象
    ObjectTool tool = new ObjectTool();
    //調(diào)用方法,傳入的參數(shù)是什么類(lèi)型,返回值就是什么類(lèi)型
    tool.show("hello");
    tool.show(12);
    tool.show(12.5);
}

3.3泛型類(lèi)派生出的子類(lèi)

前面我們已經(jīng)定義了泛型類(lèi)臭家,泛型類(lèi)是擁有泛型這個(gè)特性的類(lèi)疲陕,它本質(zhì)上還是一個(gè)Java類(lèi),那么它就可以被繼承

那它是怎么被繼承的呢钉赁?蹄殃?這里分兩種情況

  1. 子類(lèi)明確泛型類(lèi)的類(lèi)型參數(shù)變量

  2. 子類(lèi)不明確泛型類(lèi)的類(lèi)型參數(shù)變量

3.3.1子類(lèi)明確泛型類(lèi)的類(lèi)型參數(shù)變量

  • 泛型接口
/*
   把泛型定義在接口上
 */
public interface Inter<T> {
    public abstract void show(T t);
}
  • 實(shí)現(xiàn)泛型接口的類(lèi).....
/**
 * 子類(lèi)明確泛型類(lèi)的類(lèi)型參數(shù)變量:
 */
public class InterImpl implements Inter<String> {
    @Override
    public void show(String s) {
        System.out.println(s);
    }
}

3.3.2子類(lèi)不明確泛型類(lèi)的類(lèi)型參數(shù)變量

  • 當(dāng)子類(lèi)不明確泛型類(lèi)的類(lèi)型參數(shù)變量時(shí),外界使用子類(lèi)的時(shí)候你踩,也需要傳遞類(lèi)型參數(shù)變量進(jìn)來(lái)诅岩,在實(shí)現(xiàn)類(lèi)上需要定義出類(lèi)型參數(shù)變量
/**
 * 子類(lèi)不明確泛型類(lèi)的類(lèi)型參數(shù)變量:
 *      實(shí)現(xiàn)類(lèi)也要定義出<T>類(lèi)型的
 *
 */
public class InterImpl<T> implements Inter<T> {

    @Override
    public void show(T t) {
        System.out.println(t);
    }
}

測(cè)試代碼:

public static void main(String[] args) {
     //測(cè)試第一種情況
     //Inter<String> i = new InterImpl();
     //i.show("hello");
    
     //第二種情況測(cè)試
     Inter<String> ii = new InterImpl<>();
     ii.show("100");
}

值得注意的是:

  • 實(shí)現(xiàn)類(lèi)的要是重寫(xiě)父類(lèi)的方法,返回值的類(lèi)型是要和父類(lèi)一樣的姓蜂!

  • 類(lèi)上聲明的泛形只對(duì)非靜態(tài)成員有效


3.4類(lèi)型通配符

為什么需要類(lèi)型通配符按厘??钱慢?逮京?我們來(lái)看一個(gè)需求.......

現(xiàn)在有個(gè)需求:方法接收一個(gè)集合參數(shù),遍歷集合并把集合元素打印出來(lái)束莫,怎么辦懒棉?

  • 按照我們沒(méi)有學(xué)習(xí)泛型之前草描,我們可能會(huì)這樣做:
public void test(List list){
    for(int i=0;i<list.size();i++){
        System.out.println(list.get(i));
    }
}

上面的代碼是正確的,只不過(guò)在編譯的時(shí)候會(huì)出現(xiàn)警告策严,說(shuō)沒(méi)有確定集合元素的類(lèi)型....這樣是不優(yōu)雅的...

  • 那我們學(xué)習(xí)了泛型了穗慕,現(xiàn)在要怎么做呢?妻导?有的人可能會(huì)這樣做:
public void test(List<Object> list){
    for(int i=0;i<list.size();i++){  
        System.out.println(list.get(i));
    }
}

這樣做語(yǔ)法是沒(méi)毛病的逛绵,但是這里十分值得注意的是:該test()方法只能遍歷裝載著Object的集合!>缶隆术浪!

強(qiáng)調(diào):泛型中的``并不是像以前那樣有繼承關(guān)系的,也就是說(shuō)ListList是毫無(wú)關(guān)系的J僮谩R人铡!醇疼!

那現(xiàn)在咋辦硕并??秧荆?我們是不清楚List集合裝載的元素是什么類(lèi)型的倔毙,List這樣是行不通的........于是Java泛型提供了類(lèi)型通配符 ?

所以代碼應(yīng)該改成這樣:

public void test(List<?> list){
    for(int i=0;i<list.size();i++){ 
        System.out.println(list.get(i));
    }
}

?號(hào)通配符表示可以匹配任意類(lèi)型,任意的Java類(lèi)都可以匹配.....

現(xiàn)在非常值得注意的是辰如,當(dāng)我們使用?號(hào)通配符的時(shí)候:就只能調(diào)對(duì)象與類(lèi)型無(wú)關(guān)的方法普监,不能調(diào)用對(duì)象與類(lèi)型有關(guān)的方法。

記住琉兜,只能調(diào)用與對(duì)象無(wú)關(guān)的方法凯正,不能調(diào)用對(duì)象與類(lèi)型有關(guān)的方法。因?yàn)橹钡酵饨缡褂貌胖谰唧w的類(lèi)型是什么豌蟋。也就是說(shuō)廊散,在上面的List集合,我是不能使用add()方法的梧疲。因?yàn)閍dd()方法是把對(duì)象丟進(jìn)集合中允睹,而現(xiàn)在我是不知道對(duì)象的類(lèi)型是什么。


3.4.1設(shè)定通配符上限

首先幌氮,我們來(lái)看一下設(shè)定通配符上限用在哪里....

現(xiàn)在缭受,我想接收一個(gè)List集合,它只能操作數(shù)字類(lèi)型的元素【Float该互、Integer米者、Double、Byte等數(shù)字類(lèi)型都行】,怎么做蔓搞?胰丁??

我們學(xué)習(xí)了通配符喂分,但是如果直接使用通配符的話锦庸,該集合就不是只能操作數(shù)字了。因此我們需要用到設(shè)定通配符上限

List<? extends Number>

上面的代碼表示的是:List集合裝載的元素只能是Number的子類(lèi)或自身

public static void main(String[] args) {
    //List集合裝載的是Integer蒲祈,可以調(diào)用該方法
    List<Integer> integer = new ArrayList<>();
    test(integer);

    //List集合裝載的是String甘萧,在編譯時(shí)期就報(bào)錯(cuò)了
    List<String> strings = new ArrayList<>();
    test(strings);
}

public static void test(List<? extends Number> list) {
        
}

3.4.2設(shè)定通配符下限

既然上面我們已經(jīng)說(shuō)了如何設(shè)定通配符的上限,那么設(shè)定通配符的下限也不是陌生的事了梆掸。直接來(lái)看語(yǔ)法吧

//傳遞進(jìn)來(lái)的只能是Type或Type的父類(lèi)
<? super Type>

設(shè)定通配符的下限這并不少見(jiàn)幔嗦,在TreeSet集合中就有....我們來(lái)看一下

public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

那它有什么用呢?沥潭?我們來(lái)想一下,當(dāng)我們想要?jiǎng)?chuàng)建一個(gè)TreeSet類(lèi)型的變量的時(shí)候嬉挡,并傳入一個(gè)可以比較String大小的Comparator钝鸽。

那么這個(gè)Comparator的選擇就有很多了,它可以是Comparator庞钢,還可以是類(lèi)型參數(shù)是String的父類(lèi)拔恰,比如說(shuō)Comparator....

這樣做,就非常靈活了基括。也就是說(shuō)颜懊,只要它能夠比較字符串大小,就行了

經(jīng)評(píng)論去補(bǔ)充:在泛型的上限和下限中有一個(gè)原則:PECS(Producer Extends Consumer Super)

書(shū)上是這樣寫(xiě)的:

帶有子類(lèi)限定的可以從泛型讀取【也就是--->(? extend T)】-------->Producer Extends 帶有超類(lèi)限定的可以從泛型寫(xiě)入【也就是--->(? super T)】-------->Consumer Super 也有相關(guān)博文寫(xiě)得很好:

http://blog.51cto.com/flyingc...
https://blog.csdn.net/xx32666...

3.5通配符和泛型方法

大多時(shí)候风皿,我們都可以使用泛型方法來(lái)代替通配符的.....

//使用通配符
public static void test(List<?> list) {

}

//使用泛型方法
public <T> void  test2(List<T> t) {
        
}

上面這兩個(gè)方法都是可以的.....那么現(xiàn)在問(wèn)題來(lái)了河爹,我們使用通配符還是使用泛型方法呢?桐款?

原則:

  • 如果參數(shù)之間的類(lèi)型有依賴(lài)關(guān)系咸这,或者返回值是與參數(shù)之間有依賴(lài)關(guān)系的。那么就使用泛型方法

  • 如果沒(méi)有依賴(lài)關(guān)系的魔眨,就使用通配符媳维,通配符會(huì)靈活一些.


3.6泛型擦除

泛型是提供給javac編譯器使用的,它用于限定集合的輸入類(lèi)型遏暴,讓編譯器在源代碼級(jí)別上侄刽,即擋住向集合中插入非法數(shù)據(jù)。但編譯器編譯完帶有泛形的java程序后朋凉,生成的class文件中將不再帶有泛形信息州丹,以此使程序運(yùn)行效率不受到影響,這個(gè)過(guò)程稱(chēng)之為“擦除”侥啤。

3.6.1兼容性

JDK5提出了泛型這個(gè)概念当叭,但是JDK5以前是沒(méi)有泛型的茬故。也就是泛型是需要兼容JDK5以下的集合的。

當(dāng)把帶有泛型特性的集合賦值給老版本的集合時(shí)候蚁鳖,會(huì)把泛型給擦除了磺芭。

值得注意的是:它保留的就類(lèi)型參數(shù)的上限。

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

//類(lèi)型被擦除了醉箕,保留的是類(lèi)型的上限钾腺,String的上限就是Object
List list1 = list;

如果我把沒(méi)有類(lèi)型參數(shù)的集合賦值給帶有類(lèi)型參數(shù)的集合賦值,這又會(huì)怎么樣讥裤?放棒?

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

它也不會(huì)報(bào)錯(cuò),僅僅是提示“未經(jīng)檢查的轉(zhuǎn)換”


四己英、泛型的應(yīng)用

當(dāng)我們寫(xiě)網(wǎng)頁(yè)的時(shí)候间螟,常常會(huì)有多個(gè)DAO,我們要寫(xiě)每次都要寫(xiě)好幾個(gè)DAO损肛,這樣會(huì)有點(diǎn)麻煩厢破。

那么我們想要的效果是什么呢?治拿?只寫(xiě)一個(gè)抽象DAO摩泪,別的DAO只要繼承該抽象DAO,就有對(duì)應(yīng)的方法了劫谅。

要實(shí)現(xiàn)這樣的效果见坑,肯定是要用到泛型的。因?yàn)樵诔橄?code>DAO中捏检,是不可能知道哪一個(gè)DAO會(huì)繼承它自己荞驴,所以是不知道其具體的類(lèi)型的。而泛型就是在創(chuàng)建的時(shí)候才指定其具體的類(lèi)型贯城。

  • 抽象DAO
public abstract class BaseDao<T> {

    //模擬hibernate....
    private Session session;
    private Class clazz;
    
    
    //哪個(gè)子類(lèi)調(diào)的這個(gè)方法戴尸,得到的class就是子類(lèi)處理的類(lèi)型(非常重要)
    public BaseDao(){
        Class clazz = this.getClass();  //拿到的是子類(lèi)
        ParameterizedType  pt = (ParameterizedType) clazz.getGenericSuperclass();                 //BaseDao<Category>
        clazz = (Class) pt.getActualTypeArguments()[0];
        System.out.println(clazz);
        
    }
    

    public void add(T t){
        session.save(t);
    }
    
    public T find(String id){
        return (T) session.get(clazz, id);
    }
    
    public void update(T t){
        session.update(t);
    }
    
    public void delete(String id){
        T t = (T) session.get(clazz, id);
        session.delete(t);
    }
    
}
  • 繼承抽象DAO,該實(shí)現(xiàn)類(lèi)就有對(duì)應(yīng)的增刪改查的方法了冤狡。

CategoryDao

public class CategoryDao extends BaseDao<Category> {

}

BookDao

public class BookDao extends BaseDao<Book> {

}

五孙蒙、最后

泛型的基礎(chǔ)就介紹到這里了,如果以后有需要的話再進(jìn)行深入研究吧~如果覺(jué)得該文章幫助到你悲雳,不妨點(diǎn)個(gè)贊挎峦,關(guān)注公眾號(hào)一波~

參考資料:

  • Core Java

如果文章有錯(cuò)的地方歡迎指正,大家互相交流合瓢。習(xí)慣在微信看技術(shù)文章坦胶,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市顿苇,隨后出現(xiàn)的幾起案子峭咒,更是在濱河造成了極大的恐慌,老刑警劉巖纪岁,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凑队,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡幔翰,警方通過(guò)查閱死者的電腦和手機(jī)漩氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遗增,“玉大人叫惊,你說(shuō)我怎么就攤上這事∽鲂蓿” “怎么了霍狰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵氢哮,是天一觀的道長(zhǎng)滩报。 經(jīng)常有香客問(wèn)我,道長(zhǎng)频祝,這世上最難降的妖魔是什么旋炒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮签杈,結(jié)果婚禮上瘫镇,老公的妹妹穿的比我還像新娘。我一直安慰自己答姥,他們只是感情好铣除,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鹦付,像睡著了一般尚粘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敲长,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天郎嫁,我揣著相機(jī)與錄音,去河邊找鬼祈噪。 笑死泽铛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辑鲤。 我是一名探鬼主播盔腔,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了弛随?” 一聲冷哼從身側(cè)響起瓢喉,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舀透,沒(méi)想到半個(gè)月后栓票,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盐杂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年逗载,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链烈。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厉斟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出强衡,到底是詐尸還是另有隱情擦秽,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布漩勤,位于F島的核電站感挥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏越败。R本人自食惡果不足惜触幼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望究飞。 院中可真熱鬧置谦,春花似錦、人聲如沸亿傅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葵擎。三九已至谅阿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酬滤,已是汗流浹背签餐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盯串,地道東北人贱田。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嘴脾,于是被迫代替她去往敵國(guó)和親男摧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蔬墩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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

  • 泛型 體驗(yàn)泛型 沒(méi)有使用泛型時(shí),只要是對(duì)象耗拓,不管是什么類(lèi)型的對(duì)象拇颅,都可以存儲(chǔ)進(jìn)同一個(gè)集合中。使用泛型集合乔询,可以將一...
    bo客先生閱讀 732評(píng)論 0 8
  • Java工程師知識(shí)樹(shù)[http://www.reibang.com/p/db77d19a25f6] / Ja...
    HughJin閱讀 436評(píng)論 0 1
  • 簡(jiǎn)介 說(shuō)起各種高級(jí)語(yǔ)言樟插,不得不談泛型,當(dāng)我們?cè)谑褂胘ava集合的時(shí)候竿刁,會(huì)發(fā)現(xiàn)集合有個(gè)缺點(diǎn):把一個(gè)對(duì)象“丟進(jìn)”集合之...
    雙木ll之林閱讀 265評(píng)論 0 1
  • 泛型即參數(shù)化類(lèi)型黄锤。其只是作用于代碼編譯階段,在編譯過(guò)程中食拜,對(duì)于正確檢驗(yàn)泛型結(jié)果后鸵熟,會(huì)將泛型的相關(guān)信息擦除,也就是說(shuō)...
    swz_android閱讀 634評(píng)論 0 2
  • 1负甸、為什么引入泛型 bug是編程的一部分流强,我們只能盡自己最大的能力減少出現(xiàn)bug的幾率,但是誰(shuí)也不能保證自己寫(xiě)出的...
    冰河winner閱讀 525評(píng)論 0 1