摘要:得出的結(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)型前加“
public interface Generator{ T next(); }
第二種解決方法,在接口名后加“
泛型類(lèi)/接口在使用前,必須先指名參數(shù)類(lèi)型,其中除了泛型方法外的泛型參數(shù)都將是所指定的類(lèi)型。如下:
// 泛型接口與其子類(lèi) public interface GeneratorDemo 2{ 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 } }
即靜態(tài)方法無(wú)法訪問(wèn)泛型類(lèi)上定義的泛型,此時(shí)采用泛型方法可解決。
// 正確做法 public class StaticGenerator { public staticDemo 3T rebey(T t) { return null; } }
在《深入理解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 4public class Utilities { public staticHashSet 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
此外,通過(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
泛型類(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) ...
摘要:今天我要分享的是在中優(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ù)造輪子。今天我要分...
摘要:參數(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ù)用...
摘要:泛型類(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ù),...
閱讀 3330·2021-09-09 11:39
閱讀 1247·2021-09-09 09:33
閱讀 1147·2019-08-30 15:43
閱讀 561·2019-08-29 14:08
閱讀 1744·2019-08-26 13:49
閱讀 2393·2019-08-26 10:09
閱讀 1561·2019-08-23 17:13
閱讀 2301·2019-08-23 12:57