泛型的動態引數型別使用介紹

2021-06-16 05:19:04 字數 971 閱讀 9467

在使用泛型技術時,我們經常使用靜態泛型引數,即泛型的引數型別在編譯時就已經確定,比如:

ilist

<

int>

list

=new

list

<

int>

();

集合ilist的泛型引數是int型別,這在編譯期就可以知道,於是,我們可以這樣呼叫ilist<>的add方法:

list.add(

6) ;

如果泛型的引數型別是動態的了,也就是說,只有當程式執行起來後,才知道泛型引數的具體型別,其可能是int,也可能是string或其它。那該如何?使用反射,大家都知道這個答案,是的,使用反射可以解決問題,但是,反射就會有兩個與身俱來的缺陷:一是喪失了強型別的好處,二是效率不高。

還有一種更優雅的解決方案,那就是使用動態**。針對上述的例子,我們首先定義乙個非泛型的介面:

//////

i******list 用於建立動態**,將執行時的ilist

<>

介面轉換為靜態的i******list介面

///

public

inte***ce

i******list

然後,呼叫esbasic.emit.dynamictypeemitter類的static createdynamicproxy方法,建立動態**例項,該動態**實現了i******list介面,接著便可以呼叫i******list的add方法來新增元素到集合中。

當泛型的引數型別是動態的

在使用泛型技術時,我們經常使用靜態泛型引數,即泛型的引數型別在編譯時就已經確定,比如 ilist int list new list int 集合ilist的泛型引數是int型別,這在編譯期就可以知道,於是,我們可以這樣呼叫ilist 的add方法 list.add 6 如果泛型的引數型別是動態的了...

使用 泛型類 泛型方法 解決 動態型別 問題

專案中用到乙個類,他有乙個儲存資料的屬性value,這個屬性有個比較奇怪的地方就是,他的型別,是無法預先估計的,會隨著軟體的擴充套件而變化,也就是我們常說的動態型別。二 分析問題 這個問題解決方法很容易就可以看出有2種 1 使用object基類 使用這種方式能夠解決問題,但是會引起裝箱 拆箱等影響效...

泛型 引數化型別

定義 定義1 把型別引數化 定義2 例如 public class generic 此時的t便是泛型,理解 泛型是個資料型別,可以用t定義變數 引數化 目的 作用位置 類,介面,方法 特點 泛型類 不能對確切的泛型型別使用instanceof操作 泛型類不會自動封裝,不會自動轉化資料型別 測試 pu...