溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java泛型實(shí)例分析

發(fā)布時間:2022-01-10 15:42:42 來源:億速云 閱讀:123 作者:iii 欄目:編程語言

這篇文章主要介紹“Java泛型實(shí)例分析”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Java泛型實(shí)例分析”文章能幫助大家解決問題。

首先,我們來看看泛型Java的經(jīng)典用法:

import java.util.*;

public class UseGeneric

{

  public static void main(String[] args)

  {

    Vectorvi = new Vector();

    vi.add(new Integer(24));

    vi.add(35);

    for(Integer i : vi)

  {

    System.out.println(i);

  }

  }

}

上面的代碼展示了泛型容器、自動裝箱和增強(qiáng)for循環(huán)三項(xiàng)新特性。的確,從簡化代碼的角度來說,這些新特性有一定的幫助——當(dāng)然,自動裝箱其實(shí)不應(yīng)該算一項(xiàng)很有意義的特性,只是因?yàn)镴ava固有的兩套類型體制將int、char等原生類型與對象區(qū)分對待,所以在引入泛型容器時不得不采用自動裝箱作為補(bǔ)救。

將上面的代碼編譯后的class進(jìn)行反編譯,得到下列代碼:

import java.io.PrintStream;

import java.util.Vector;

public class UseGeneric

{

  public UseGeneric()

  {

  }

  public static void main(String args[])

  {

   Vector vector = new Vector();

  vector.add(new Integer(24));

  vector.add(Integer.valueOf(35));

  Integer integer;

  for(SimpleIterator simpleiterator = vector.iterator(); simpleiterator.hasNext(); System.out.println(integer))

  integer = (Integer)simpleiterator.next();

  }

}

可以看到,所有的新特性都是在現(xiàn)有虛擬機(jī)的基礎(chǔ)上實(shí)現(xiàn)的,沒有任何新鮮感可言。的確如Joshua Bloch所說的,只不過是把以前由程序員寫的一些代碼轉(zhuǎn)成由編譯器來寫。

隨后我試圖實(shí)現(xiàn)一些略微高級的泛型技術(shù),例如type traits。我寫了下列代碼:

// General Traits

class NumTraits

{

  public void doSomething()

  {

    System.out.println("General Traits");

  }

}

// Specialized Traits

class NumTraits<Integer)

{

  public void doSomething()

  {

    System.out.println("Traits for Integer");

  }

}

可惜,這段代碼不能通過編譯,編譯器提示“duplicate class”。顯然,編譯器并沒有把類型參數(shù)作為類名稱的一部分,因此traits是不可能實(shí)現(xiàn)的了。當(dāng)然,在成員方法中可以編寫類似于模板特化(specialization)甚至偏特化(partial-specialization)的代碼,但是下面的代碼將證明這種東西毫無意義。

public class Happy

{

  private T subject = new T();

  publicvoid happy()

  {

    subject.beHappy();

  }

  public static void main(String[] args)

  {

    Happyo1 = new Happy();

    o1.happy();

    Happyo2 = new Happy();

    o2.happy();

  }

}

這里的編譯錯誤有兩種。首先,“private T subject = new T();”這個語句不能編譯,也許是我還沒有找到實(shí)例化類型參數(shù)的正確方法吧。更重要的是,編譯器提示“在java.lang.object中找不到happy()方法”。由于Java采用“擦拭法”實(shí)現(xiàn)泛型,所有類型參數(shù)(除非顯式聲明超類或接口)都將被擦拭為Object,因此方法調(diào)用的契約仍然完全依賴對象系統(tǒng)來保證。換句話說,類似于模板特化之類的技巧不但在效率上毫無幫助,而且根本無法像C++那樣依賴編譯器進(jìn)行比較高級的檢查甚至編譯期計(jì)算。Typelist?select模板?還是不要想了吧。

關(guān)于“Java泛型實(shí)例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI