范型是這樣的 2

2021-08-29 09:24:39 字數 1964 閱讀 5636

上篇主要將和這類范型變數定義

而<>中如果是具體的某個類或者是?之類的就不是范型變數定義了,比如,,<? extends list>.比方說以下**

public class classa extends classb>

就classb>來說,對應的是parameterizedtype,這時候沒有對范型變數的定義了,而是把那些范型定義中的大寫字母例項化成了具體的type。typevariable和parameterizedtype就像類和例項間的關係。

如果只是單獨的classb,沒有任何<>,那麼它就對應普通的class類,普通類也是type的一種。

當我們呼叫

class.getgenericsuperclass

class.getgenericinte***ces

method.getgenericexceptiontypes

method.getgenericparametertypes

method.getgenericreturntype

constructor.getgenericexceptiontypes

constructor.getgenericparametertypes

都會返回type物件或者type陣列,這些type有可能parameterizedtype, class, genericarraytype中的一種,需要進行執行時型別檢查,然後在強制轉型做處理。這裡是wildcardtype可能性不大,畢竟無論是超類,介面,方法入參,返回值和異常都不可能用?萬用字元這種wildcardtype.

如果使用classa.getgenericsuperclass()方法返回的type,檢查後就會轉型成parameterizedtype。然後可以通過parameterizedtype.getactualtypearguments再得到乙個type陣列,這些type陣列對應的就是string, string, ? super list, classc,四種范型。

進一步,classb中的四個范型變數的例項,分別是

string,對應class,

string,對應genericarraytype

? extends list,對應wildcardtype

classc,又對應parameterizetype

這些都是要通過執行時型別檢查來判斷他們到底是什麼樣的type

拿到class,那麼該幹嘛幹嘛,不用多說

當我們拿到的是genericarraytype,那麼對應的就是乙個陣列,可以通過getgenericcomponenttype方法拿到實際定義陣列的型別,返回的type可能是class,parameterizetype繼續做檢查然後再轉型吧,當然也是有肯能是genericarraytype,比如二維陣列。

當我們拿到的是wildcardtype,可以通過getlowerbounds和getsuperbounds來獲取?對應的上下邊界type,這裡拿到的type也是不確定需要做檢查的,可能的型別包括class,parameterizetype, 或者genericarraytype,wildcardtype應該不會出現。

當我們拿到的是parameterizetype,那麼可以通過getactualtypearguments進一步獲取classc中的引數string.class(其實還是type經過檢查獲取的),也可以通過getrawtype拿到classc.class

總之這麼一層一層的下去,不停的通過各種方法獲取type和type陣列,然後判定是那一種type,再繼續處理。但不太可能拿到的type是typevariable了。所以對於整個范型模型的理解層次,我覺得

最高自然是type,

接下去是genericdeclaration和typevariable

最下層是parameterizedtype,class,genericarraytype,wildcardtype

實際上可能parameterizedtype,class比後兩者略高

范型的轉變

還是回到上次聽講座的時候,第一部分的就是 范型的轉變 其中的內容主要講了瀑布式模型怎麼在一開始就不成立,而因為誤解卻廣為傳播。同時,迭代式開發也並非是瀑布式開發的後繼者或者改良,而是同步發展的另一種對軟體開發的思維方式。也就是另一種范型。呵呵,兩頭牛在聊天,一頭說 最近瘋牛症很流行啊?搞得我擔心的都...

第15周范型程式(2)

煙台大學計算機學院 檔名稱 xiangmu1.cpp 完成日期 2016年6月24日 版本號 vc 6.0 問題描述 輸入描述 程式輸出 include include include include using namespace std void show double int main dou...

generics 范型 的使用

什麼是范型?u system.collections.generic命名空間包含了范型集合需要的類和介面 u 我們在寫程式的時候 經常需要這種東西 可變長度的 array,比如說乙個 string 而事實上定義了乙個 string 並初始化後那麼它的長度就固定了 array 根本做不到 如果非要實現...