java泛型

java泛型

  • 理解泛型

    我們來(lái)看一段代碼:

public void static main(String args[])
{
    List list=new Arraylist();
    list.add("String");
    list.add(100);
  
}
public void static out(List list){
    for(int i=0;i<list.size();i++)
    {
        String var=(String)list.get(i);  //出錯(cuò) 100是正數(shù)不是String
        System.out.prinln("var :"+var);
    }
}

編譯通過(guò)傲隶,運(yùn)行時(shí)出錯(cuò)饺律,因?yàn)榫幾g時(shí)候List 默認(rèn)是Object 類型所以不會(huì)出錯(cuò),但是運(yùn)行時(shí)類型強(qiáng)制轉(zhuǎn)換就會(huì)出錯(cuò)跺株,那么有沒(méi)有一種方法保證編譯時(shí)讓其類型必須相同不然編譯不通過(guò)呢复濒?有那就是泛型類型脖卖。

簡(jiǎn)單來(lái)說(shuō)是為了防止當(dāng)編譯時(shí)是Object的對(duì)象,運(yùn)行時(shí)才知道具體類型的對(duì)象強(qiáng)制轉(zhuǎn)換錯(cuò)誤而用泛型來(lái)代替巧颈。

  • 運(yùn)行時(shí)繞過(guò)泛型限制

    public static void main(String args[])
    {
          List<String> list = new ArrayList<String>();
          Class sClass = list.getClass();
          Method me;
          try {
              me = sClass.getMethod("add", Object.class);
              me.invoke(list, 100);//添加Integer類型數(shù)據(jù)
              Method method = sClass.getMethod("get", int.class);
              Object i = method.invoke(list, 0);//獲取list.get(0)數(shù)據(jù)
              System.out.println(i);//輸出
          } catch (NoSuchMethodException | SecurityException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IllegalAccessException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IllegalArgumentException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (InvocationTargetException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      
    }
    

    從中我們可以看出畦木,泛型并不能限制運(yùn)行時(shí)的對(duì)象。

  • 泛型‘砸泛?’和'E T V'

    T E V都是一樣的只是不同符號(hào)也可以用A ,B, C十籍,一般T代表type, E代表集合元素唇礁,V代表Value

    勾栗?是用于限制類型上下邊界List<? extends father>只要是father的子類都可以,當(dāng)然也可以不限制類型 比如ist<?>

  • 泛型有上下變界

    1. 上邊界是 <盏筐? extends T>必須要是T的子類
    2. 下邊界是<围俘?supers T>必須要是T的父類
  • 泛型應(yīng)用

    我們來(lái)看一個(gè)簡(jiǎn)單泛型應(yīng)用:

    //先定義一個(gè)FatherBox接口
    public interface FatherBox {
     void println();
     int getID();
    }
    //定義兩個(gè)FatherBox的子類
    public class ChildFirstBox implements FatherBox {
      static int id = 0;
      private final int _id;
      public ChildFirstBox() {
          // TODO Auto-generated constructor stub
          id++;
          _id=id;
      }
    
      @Override
      public void println() {
          // TODO Auto-generated method stub
          System.out.println("ChildFirstBox Id:"+_id);
      }
    
      @Override
      public int getID() {
          // TODO Auto-generated method stub
          return _id;
      }
    
    }
    
    public class ChildSecondBox implements FatherBox {
      static int id = 0;
      private final int _id;
      public ChildSecondBox() {
          // TODO Auto-generated constructor stub
          id++;
          _id = id;
      }
    
      @Override
      public void println() {
          // TODO Auto-generated method stub
          System.out.println("ChildSecondBox ID:" + _id);
      }
    
      @Override
      public int getID() {
          // TODO Auto-generated method stub
          return _id;
      }
    
    }
    //試運(yùn)行程序
      public static void main(String[] args) {
          ChildFirstBox tBox = new ChildFirstBox();
          ChildSecondBox tBox2 = new ChildSecondBox();
          List<FatherBox> as = new ArrayList<>();
          as.add(tBox);
          as.add(tBox2);
          getNumChildFB(as);
      }
    
      public static void getNumChildFB(List<? extends FatherBox> sdf) {
          for (FatherBox t : sdf) {
              t.println();
          }
    
      }
    
  Box 對(duì)象可以接受任何FatherBox的子類對(duì)象,并正確的輸出琢融。從上面的例子中界牡,我們可以看出泛型相當(dāng)于Object,只是Object無(wú)法在編譯時(shí)指定類型漾抬,而泛型可以欢揖。
  • 泛型優(yōu)點(diǎn)

    1. 類型安全

      編譯器可以知道當(dāng)前類型,提高java程序的類型安全

    2. 消除強(qiáng)制類型轉(zhuǎn)化

      消除源代碼中的許多強(qiáng)制類型轉(zhuǎn)換

    3. 提高性能

      為以后jvm優(yōu)化提供了可能性

  • 泛型注意事項(xiàng)

    1. 泛型的類型參數(shù)只能是類類型(包括自定義類)奋蔚,不能是簡(jiǎn)單類型她混。
    2. 泛型的類型參數(shù)可以有多個(gè)。
    3. 不能對(duì)確切的泛型類型使用instanceof操作泊碑。
    4. 不能創(chuàng)建一個(gè)確切的泛型類型的數(shù)組坤按。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市馒过,隨后出現(xiàn)的幾起案子臭脓,更是在濱河造成了極大的恐慌,老刑警劉巖腹忽,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件来累,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡窘奏,警方通過(guò)查閱死者的電腦和手機(jī)嘹锁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)着裹,“玉大人领猾,你說(shuō)我怎么就攤上這事。” “怎么了摔竿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵面粮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我继低,道長(zhǎng)熬苍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任袁翁,我火速辦了婚禮柴底,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梦裂。我一直安慰自己,他們只是感情好盖淡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布年柠。 她就那樣靜靜地躺著,像睡著了一般褪迟。 火紅的嫁衣襯著肌膚如雪冗恨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天味赃,我揣著相機(jī)與錄音掀抹,去河邊找鬼。 笑死心俗,一個(gè)胖子當(dāng)著我的面吹牛傲武,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播城榛,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼揪利,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了狠持?” 一聲冷哼從身側(cè)響起疟位,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喘垂,沒(méi)想到半個(gè)月后甜刻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡正勒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年得院,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片章贞。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尿招,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情就谜,我是刑警寧澤怪蔑,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站丧荐,受9級(jí)特大地震影響缆瓣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虹统,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一弓坞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧车荔,春花似錦渡冻、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至珠增,卻和暖如春超歌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒂教。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工巍举, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凝垛。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓懊悯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親梦皮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子定枷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 開(kāi)發(fā)人員在使用泛型的時(shí)候,很容易根據(jù)自己的直覺(jué)而犯一些錯(cuò)誤届氢。比如一個(gè)方法如果接收List作為形式參數(shù)欠窒,那么如果嘗試...
    時(shí)待吾閱讀 1,045評(píng)論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法退子,內(nèi)部類的語(yǔ)法岖妄,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法寂祥,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,597評(píng)論 18 399
  • 泛型 泛型由來(lái) 泛型字面意思不知道是什么類型荐虐,但又好像什么類型都是⊥杵荆看前面用到的集合都有泛型的影子福扬。 以Array...
    向日花開(kāi)閱讀 2,188評(píng)論 2 6
  • 今晚樂(lè)樂(lè)拿著洗臉的安慰書(shū)——家里最小的書(shū)《兒童學(xué)習(xí)口袋卡之兒歌》上床了腕铸。這本小書(shū)是朋友兒子長(zhǎng)大了送來(lái)的舊書(shū)。原本以...
    給你們_樂(lè)樂(lè)與開(kāi)心閱讀 483評(píng)論 0 1
  • 風(fēng)和日麗的好天氣铛碑,遠(yuǎn)處的半空中飄著彩色氣球狠裹,一群小朋友在草地上撒歡嬉戲。 我坐在窗前出神汽烦,王浩男跑到我跟前涛菠,嘴巴貼...
    二王子閱讀 252評(píng)論 4 2