這篇文章主要介紹“Java泛型實(shí)例分析”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Java泛型實(shí)例分析”文章能幫助大家解決問題。
成都創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì),網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十多年品質(zhì),值得信賴!首先,我們來看看泛型Java的經(jīng)典用法:
import java.util.*;
public class UseGeneric
{
public static void main(String[] args)
{
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 { 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(); public { subject.beHappy(); } public static void main(String[] args) { Happy o1.happy(); 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)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
當(dāng)前名稱:Java泛型實(shí)例分析-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://weahome.cn/article/djjdoj.html