成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

是你眼中的泛型嗎?

alphahans / 453人閱讀

摘要:得出的結(jié)論是兩個(gè)方法如果有相同的名稱(chēng)和特征簽名,但返回值不同,那他們也是可以合法地共存于一個(gè)文件中的。同名方法參數(shù)個(gè)數(shù)順序類(lèi)型不同,與返回值類(lèi)型無(wú)關(guān)。這是來(lái)自中的一個(gè)例子。

繼《? extends T與? super T》之后,我們?cè)倭牧姆盒汀?/p> Demo 1

public interface Generator {
     T next();
}

第一種解決方法,在方法返回類(lèi)型前加“”使其成為一個(gè)泛型方法。

public interface Generator {
    T next();
}

第二種解決方法,在接口名后加“”使其成為一個(gè)泛型接口。

泛型類(lèi)/接口在使用前,必須先指名參數(shù)類(lèi)型,其中除了泛型方法外的泛型參數(shù)都將是所指定的類(lèi)型。如下:

// 泛型接口與其子類(lèi)
public interface Generator {
    T next(T t);
    void print(T t);
}

public class SubGenerator implements Generator{

    @Override
    public String next(String t) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void print(String t) {
        // TODO Auto-generated method stub
        
    }

}

// 含有泛型方法的接口及其子類(lèi)
public interface Generator {
    T next(T t);
     void print(U t);
}

public class SubGenerator implements Generator{

    @Override
    public String next(String t) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public  void print(U t) {
        // TODO Auto-generated method stub
        
    }

}
Demo 2

即靜態(tài)方法無(wú)法訪問(wèn)泛型類(lèi)上定義的泛型,此時(shí)采用泛型方法可解決。

// 正確做法
public class StaticGenerator {
    public static  T rebey(T t) {
        return null;
    }
}
Demo 3

在《深入理解Java虛擬機(jī) JVM高級(jí)特性與最佳實(shí)踐(高清完整版)》P271 介紹了“當(dāng)泛型遇見(jiàn)重載”的例子。得出的結(jié)論是:

兩個(gè)方法如果有相同的名稱(chēng)和特征簽名,但返回值不同,那他們也是可以合法地共存于一個(gè)Class文件中的。

public String url(String s) {
    return "rebey.cn";
}

public int url(String s) {
    return 0;
}

然而以上代碼是無(wú)法編譯通過(guò)的。因?yàn)榇藭?shū)出版時(shí)還未發(fā)布JDK7,因此其實(shí)只有JDK1.6及以下才能編譯通過(guò)。隨著時(shí)間的推移,原來(lái)錯(cuò)的可能所以還是按我們?cè)瓉?lái)的理解來(lái)解讀重載就好了。同名方法參數(shù)個(gè)數(shù)、順序、類(lèi)型不同,與返回值類(lèi)型無(wú)關(guān)。

Demo 4
public class Utilities {
    public static  HashSet create(int size) {
        return new HashSet(size);
    }
     
    public static void print( HashSet h) { 
        for (String s : h) System.out.println(s);
    }
}

public class ResultGerneric {
    public static void main(String[] args) {
        Utilities.print(Utilities.create(10));    // error in Java 5,6,7 ; fine in Java 8
    }
}

這是來(lái)自GenericsFAQ403中的一個(gè)例子。筆者在java7上測(cè)試了,如愿的看到了錯(cuò)誤提示:“The method print(HashSet) in the type Utilities is not applicable for the arguments (HashSet)”。由于Utilities.create方法未指定具體類(lèi)型,默認(rèn)轉(zhuǎn)為Object,所以Utilities.print此時(shí)無(wú)法接收其作為String類(lèi)型的參數(shù)。而在Java8版本的增加了類(lèi)型推斷(type argument inference),能夠根據(jù)賦值符號(hào)左邊值類(lèi)型自動(dòng)推斷出右邊。

此外,通過(guò)顯示指定參數(shù)類(lèi)型也能夠解決上述問(wèn)題:

public class ResultGerneric {
    public static void main(String[] args) {
        Utilities.print(Utilities.create(10));//點(diǎn)操作符與方法名之間
    }
}

在《Think In Java》4th中泛型章節(jié)也提到了相似的例子(P363)。

說(shuō)點(diǎn)什么

通過(guò)幾個(gè)泛型的例子,我們看到:隨著時(shí)間的推移,對(duì)的可能錯(cuò),錯(cuò)的亦能對(duì)。

這不是很有趣的一件事嗎?

待續(xù)...

更多有意思的內(nèi)容,歡迎訪問(wèn)筆者小站: rebey.cn

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67310.html

相關(guān)文章

  • Java? 教程(泛型類(lèi)型)

    泛型類(lèi)型 泛型類(lèi)型是通過(guò)類(lèi)型參數(shù)化的泛型類(lèi)或接口,修改以下Box類(lèi)以演示此概念。 一個(gè)簡(jiǎn)單的Box類(lèi) 首先檢查一個(gè)對(duì)任何類(lèi)型的對(duì)象進(jìn)行操作的非泛型Box類(lèi),它只需要提供兩個(gè)方法:set,它將一個(gè)對(duì)象添加到box中,get,它將檢索它: public class Box { private Object object; public void set(Object object) ...

    Crazy_Coder 評(píng)論0 收藏0
  • Spring 中優(yōu)雅的獲取泛型信息

    摘要:今天我要分享的是在中優(yōu)雅的獲取泛型。通過(guò)反射獲得定義中聲明的父類(lèi)的泛型參數(shù)的類(lèi)型注意泛型必須定義在父類(lèi)處這是唯一可以通過(guò)反射從泛型獲得實(shí)例的地方如無(wú)法找到返回如工具從開(kāi)始中添加了工具,這個(gè)類(lèi)可以更加方便的用來(lái)回去泛型信息。 簡(jiǎn)介 Spring 源碼是個(gè)大寶庫(kù),我們能遇到的大部分工具在源碼里都能找到,所以筆者開(kāi)源的 mica 完全基于 Spring 進(jìn)行基礎(chǔ)增強(qiáng),不重復(fù)造輪子。今天我要分...

    Aldous 評(píng)論0 收藏0
  • 理解Java中泛型(一)

    摘要:參數(shù)化的類(lèi)型其中是參數(shù)化的類(lèi)型。類(lèi)型參數(shù)的實(shí)例或?qū)嶋H類(lèi)型參數(shù)其中是類(lèi)型參數(shù)的實(shí)例或?qū)嶋H類(lèi)型參數(shù)。它們并沒(méi)有重載,而且泛型中也不存在重載這一說(shuō)法。除此之外,我們應(yīng)該盡量地多用泛型方法,而減少對(duì)整個(gè)類(lèi)的泛化,因?yàn)榉盒头椒ǜ菀装咽虑檎f(shuō)明白。 泛型是適用于許多許多的類(lèi)型 ---《JAVA編程思想》 在Java的面向?qū)ο缶幊踢^(guò)程中, 或許你知道運(yùn)用繼承、接口等一系列面向?qū)ο蟮膭?dòng)作來(lái)實(shí)現(xiàn)代碼復(fù)用...

    YFan 評(píng)論0 收藏0
  • 淺析Java泛型

    摘要:泛型類(lèi)在類(lèi)的申明時(shí)指定參數(shù),即構(gòu)成了泛型類(lèi)。換句話說(shuō),泛型類(lèi)可以看成普通類(lèi)的工廠。的作用就是指明泛型的具體類(lèi)型,而類(lèi)型的變量,可以用來(lái)創(chuàng)建泛型類(lèi)的對(duì)象。只有聲明了的方法才是泛型方法,泛型類(lèi)中的使用了泛型的成員方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一項(xiàng)新特性,它的本質(zhì)是參數(shù)化類(lèi)型(Parameterized Type)的應(yīng)用,也就是說(shuō)所操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù),...

    godiscoder 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<