摘要:得出的結(jié)論是兩個(gè)方法如果有相同的名稱和特征簽名,但返回值不同,那他們也是可以合法地共存于一個(gè)文件中的。同名方法參數(shù)個(gè)數(shù)順序類型不同,與返回值類型無關(guān)。這是來自中的一個(gè)例子。
繼《? extends T與? super T》之后,我們?cè)倭牧姆盒汀?/p> Demo 1
public interface Generator {T next(); }
第一種解決方法,在方法返回類型前加“
public interface Generator{ T next(); }
第二種解決方法,在接口名后加“
泛型類/接口在使用前,必須先指名參數(shù)類型,其中除了泛型方法外的泛型參數(shù)都將是所指定的類型。如下:
// 泛型接口與其子類 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 } } // 含有泛型方法的接口及其子類 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)方法無法訪問泛型類上定義的泛型,此時(shí)采用泛型方法可解決。
// 正確做法 public class StaticGenerator { public staticDemo 3T rebey(T t) { return null; } }
在《深入理解Java虛擬機(jī) JVM高級(jí)特性與最佳實(shí)踐(高清完整版)》P271 介紹了“當(dāng)泛型遇見重載”的例子。得出的結(jié)論是:
兩個(gè)方法如果有相同的名稱和特征簽名,但返回值不同,那他們也是可以合法地共存于一個(gè)Class文件中的。
public String url(String s) { return "rebey.cn"; } public int url(String s) { return 0; }
然而以上代碼是無法編譯通過的。因?yàn)榇藭霭鏁r(shí)還未發(fā)布JDK7,因此其實(shí)只有JDK1.6及以下才能編譯通過。隨著時(shí)間的推移,原來錯(cuò)的可能所以還是按我們?cè)瓉淼睦斫鈦斫庾x重載就好了。同名方法參數(shù)個(gè)數(shù)、順序、類型不同,與返回值類型無關(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 } }
這是來自GenericsFAQ403中的一個(gè)例子。筆者在java7上測(cè)試了,如愿的看到了錯(cuò)誤提示:“The method print(HashSet
此外,通過顯示指定參數(shù)類型也能夠解決上述問題:
public class ResultGerneric { public static void main(String[] args) { Utilities.print(Utilities.create(10));//點(diǎn)操作符與方法名之間 } }
在《Think In Java》4th中泛型章節(jié)也提到了相似的例子(P363)。
說點(diǎn)什么通過幾個(gè)泛型的例子,我們看到:隨著時(shí)間的推移,對(duì)的可能錯(cuò),錯(cuò)的亦能對(duì)。
這不是很有趣的一件事嗎?
待續(xù)...
更多有意思的內(nèi)容,歡迎訪問筆者小站: rebey.cn
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67310.html
泛型類型 泛型類型是通過類型參數(shù)化的泛型類或接口,修改以下Box類以演示此概念。 一個(gè)簡(jiǎn)單的Box類 首先檢查一個(gè)對(duì)任何類型的對(duì)象進(jìn)行操作的非泛型Box類,它只需要提供兩個(gè)方法:set,它將一個(gè)對(duì)象添加到box中,get,它將檢索它: public class Box { private Object object; public void set(Object object) ...
摘要:今天我要分享的是在中優(yōu)雅的獲取泛型。通過反射獲得定義中聲明的父類的泛型參數(shù)的類型注意泛型必須定義在父類處這是唯一可以通過反射從泛型獲得實(shí)例的地方如無法找到返回如工具從開始中添加了工具,這個(gè)類可以更加方便的用來回去泛型信息。 簡(jiǎn)介 Spring 源碼是個(gè)大寶庫,我們能遇到的大部分工具在源碼里都能找到,所以筆者開源的 mica 完全基于 Spring 進(jìn)行基礎(chǔ)增強(qiáng),不重復(fù)造輪子。今天我要分...
摘要:參數(shù)化的類型其中是參數(shù)化的類型。類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)其中是類型參數(shù)的實(shí)例或?qū)嶋H類型參數(shù)。它們并沒有重載,而且泛型中也不存在重載這一說法。除此之外,我們應(yīng)該盡量地多用泛型方法,而減少對(duì)整個(gè)類的泛化,因?yàn)榉盒头椒ǜ菀装咽虑檎f明白。 泛型是適用于許多許多的類型 ---《JAVA編程思想》 在Java的面向?qū)ο缶幊踢^程中, 或許你知道運(yùn)用繼承、接口等一系列面向?qū)ο蟮膭?dòng)作來實(shí)現(xiàn)代碼復(fù)用...
摘要:泛型類在類的申明時(shí)指定參數(shù),即構(gòu)成了泛型類。換句話說,泛型類可以看成普通類的工廠。的作用就是指明泛型的具體類型,而類型的變量,可以用來創(chuàng)建泛型類的對(duì)象。只有聲明了的方法才是泛型方法,泛型類中的使用了泛型的成員方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一項(xiàng)新特性,它的本質(zhì)是參數(shù)化類型(Parameterized Type)的應(yīng)用,也就是說所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),...
閱讀 3550·2021-09-09 11:39
閱讀 1299·2021-09-09 09:33
閱讀 1199·2019-08-30 15:43
閱讀 618·2019-08-29 14:08
閱讀 1793·2019-08-26 13:49
閱讀 2449·2019-08-26 10:09
閱讀 1607·2019-08-23 17:13
閱讀 2357·2019-08-23 12:57