摘要:得出的結論是兩個方法如果有相同的名稱和特征簽名,但返回值不同,那他們也是可以合法地共存于一個文件中的。同名方法參數個數順序類型不同,與返回值類型無關。這是來自中的一個例子。
繼《? extends T與? super T》之后,我們再聊聊泛型。
Demo 1public interface Generator {T next(); }
第一種解決方法,在方法返回類型前加“
public interface Generator{ T next(); }
第二種解決方法,在接口名后加“
泛型類/接口在使用前,必須先指名參數類型,其中除了泛型方法外的泛型參數都將是所指定的類型。如下:
// 泛型接口與其子類 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 } }
即靜態方法無法訪問泛型類上定義的泛型,此時采用泛型方法可解決。
// 正確做法 public class StaticGenerator { public staticDemo 3T rebey(T t) { return null; } }
在《深入理解Java虛擬機 JVM高級特性與最佳實踐(高清完整版)》P271 介紹了“當泛型遇見重載”的例子。得出的結論是:
兩個方法如果有相同的名稱和特征簽名,但返回值不同,那他們也是可以合法地共存于一個Class文件中的。
public String url(String s) { return "rebey.cn"; } public int url(String s) { return 0; }
然而以上代碼是無法編譯通過的。因為此書出版時還未發布JDK7,因此其實只有JDK1.6及以下才能編譯通過。隨著時間的推移,原來錯的可能所以還是按我們原來的理解來解讀重載就好了。同名方法參數個數、順序、類型不同,與返回值類型無關。
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中的一個例子。筆者在java7上測試了,如愿的看到了錯誤提示:“The method print(HashSet
此外,通過顯示指定參數類型也能夠解決上述問題:
public class ResultGerneric { public static void main(String[] args) { Utilities.print(Utilities.create(10));//點操作符與方法名之間 } }
在《Think In Java》4th中泛型章節也提到了相似的例子(P363)。
說點什么通過幾個泛型的例子,我們看到:隨著時間的推移,對的可能錯,錯的亦能對。
這不是很有趣的一件事嗎?
待續...
更多有意思的內容,歡迎訪問筆者小站: rebey.cn
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67310.html
泛型類型 泛型類型是通過類型參數化的泛型類或接口,修改以下Box類以演示此概念。 一個簡單的Box類 首先檢查一個對任何類型的對象進行操作的非泛型Box類,它只需要提供兩個方法:set,它將一個對象添加到box中,get,它將檢索它: public class Box { private Object object; public void set(Object object) ...
摘要:今天我要分享的是在中優雅的獲取泛型。通過反射獲得定義中聲明的父類的泛型參數的類型注意泛型必須定義在父類處這是唯一可以通過反射從泛型獲得實例的地方如無法找到返回如工具從開始中添加了工具,這個類可以更加方便的用來回去泛型信息。 簡介 Spring 源碼是個大寶庫,我們能遇到的大部分工具在源碼里都能找到,所以筆者開源的 mica 完全基于 Spring 進行基礎增強,不重復造輪子。今天我要分...
摘要:參數化的類型其中是參數化的類型。類型參數的實例或實際類型參數其中是類型參數的實例或實際類型參數。它們并沒有重載,而且泛型中也不存在重載這一說法。除此之外,我們應該盡量地多用泛型方法,而減少對整個類的泛化,因為泛型方法更容易把事情說明白。 泛型是適用于許多許多的類型 ---《JAVA編程思想》 在Java的面向對象編程過程中, 或許你知道運用繼承、接口等一系列面向對象的動作來實現代碼復用...
摘要:泛型類在類的申明時指定參數,即構成了泛型類。換句話說,泛型類可以看成普通類的工廠。的作用就是指明泛型的具體類型,而類型的變量,可以用來創建泛型類的對象。只有聲明了的方法才是泛型方法,泛型類中的使用了泛型的成員方法并不是泛型方法。 什么是泛型? 泛型是JDK 1.5的一項新特性,它的本質是參數化類型(Parameterized Type)的應用,也就是說所操作的數據類型被指定為一個參數,...
閱讀 3222·2021-09-09 11:39
閱讀 1228·2021-09-09 09:33
閱讀 1127·2019-08-30 15:43
閱讀 546·2019-08-29 14:08
閱讀 1733·2019-08-26 13:49
閱讀 2376·2019-08-26 10:09
閱讀 1545·2019-08-23 17:13
閱讀 2283·2019-08-23 12:57