真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

.NET中的泛型和Java泛型中的類型擦除-創(chuàng)新互聯(lián)

開放類型和閉合類型

我們擁有10余年網(wǎng)頁設(shè)計和網(wǎng)站建設(shè)經(jīng)驗,從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設(shè)計師為您提供的解決方案。為企業(yè)提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計、成都做手機(jī)網(wǎng)站、H5場景定制、等業(yè)務(wù)。無論您有什么樣的網(wǎng)站設(shè)計或者設(shè)計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計服務(wù)并滿足您的需求。

.NET把帶有類型參數(shù)的類型看做一個新的類型,CLR將為這些類型創(chuàng)建內(nèi)部類型對象,帶有類型參數(shù)的類型可以是類,結(jié)構(gòu),接口和委托。但是,一個帶有類型參數(shù)的類型稱為開放類型,CLR不允許開放類型實(shí)例化(就好比不允許接口實(shí)例化一樣)。

當(dāng)代碼中引用了泛型類型,代碼里可以指定一組泛型類型參數(shù)。如果傳入實(shí)際的數(shù)據(jù)類型,那么這個類型就成為閉合類型,CLR允許實(shí)例化閉合類型。然而,也有可能代碼引用了泛型類型,但未指定泛型類型參數(shù),這就在CLR中創(chuàng)建了一個新的開放類型,這種類型無法實(shí)例化,看一個例子。

  1. internal sealed class
  2. staticvoid
  3. null
  4. // Dictionary<,> 有2個類型參數(shù)的開放類型
  5. typeof
  6. // 創(chuàng)建實(shí)例會失敗
  7. // DictionaryStringKey<>有一個類型參數(shù)的開發(fā)類型
  8. typeof
  9. // 創(chuàng)建該類型的實(shí)例也會失敗
  10. // DictionaryStringKey 是閉合類型
  11. typeof
  12. // 創(chuàng)建成功
  13. // 輸出類型名字
  14. "Object type="
  15. privatestatic
  16. null
  17. try
  18. //使用默認(rèn)的構(gòu)造函數(shù)來創(chuàng)造該類型的實(shí)例
  19. "Created instance of {0}"
  20. catch
  21. return

運(yùn)行結(jié)果:

.NET中的泛型和Java泛型中的類型擦除

Activator.CreateInstance創(chuàng)建實(shí)例的時候,會提示你該類型包含泛型參數(shù)。

輸出中,可以看到類型名稱后跟著反引號(`)以及一個數(shù)字。這個數(shù)字即類型中的類型參數(shù)的數(shù)量。比如泛型Dictionary類是2,因為它需要2個類型參數(shù)來指示TKey和TValue。DictionaryStringKey類只有1個因為它只需要指明1個類型TValue。

.NET中的類型

.net中,除了實(shí)例構(gòu)造器,CLR也支持類型構(gòu)造器(也稱作靜態(tài)夠器,類夠在其或者類型初始化器)。類型構(gòu)造器可以應(yīng)用于接口(c#中不支持),引用類型(class)和值類型(struct),和實(shí)例構(gòu)造器初始化類型的實(shí)例一樣,類型構(gòu)造器用來初始化類型的一些狀態(tài),類型的構(gòu)造器如果有的話 只可能有1個,并且是無參的??梢詤⒖贾暗奈恼隆?/p>

http://cnn237111.blog.51cto.com/2359144/576533

由于CLR保證了類型初始化器只執(zhí)行一次,并且是線程安全的,因此類型初始化器適用于用在單例模式中對單例對象的初始化。

類型中的靜態(tài)字段可以認(rèn)為是類型的一部分,而類型中的非靜態(tài)字段可以認(rèn)為是實(shí)例對象的一部分。當(dāng)JIT編譯器把IL語言轉(zhuǎn)換成本地的CPU指令的時候,會遇到很多類型(比如自定義的class),CLR為了能正確的加載包含這些類型的程序集,它會通過程序集的元數(shù)據(jù),抽取出類型的信息,然后創(chuàng)建這些類型的數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)。這些數(shù)據(jù)結(jié)構(gòu)作為對象存放在堆中。堆中所有的對象都有2個成員,類型對象指針和同步塊索引。類型中定義的靜態(tài)字段也包含在數(shù)據(jù)結(jié)構(gòu)對象中。類的實(shí)例對象都共享類型對象中同一個靜態(tài)字段。如下圖:方框中的Manager是類型對象,靜態(tài)字段存在于類型對象中。實(shí)例對象由橢圓框表示,指向類型對象。

.NET中的泛型和Java泛型中的類型擦除

對于.NET泛型來說,每一個閉合類型都有自己的靜態(tài)字段。也就是說List<>和List中的靜態(tài)字段是互相獨(dú)立的。同樣的,如果泛型類型定義了一個靜態(tài)構(gòu)造器,這些構(gòu)造器也是按照各自的閉合類型運(yùn)行。也就是說,List和List有自己獨(dú)立的靜態(tài)構(gòu)造器。

  1. staticvoidstring
  2. booltypeoftypeofstring
  3. objecttypeof
  4. typeofstring

運(yùn)行結(jié)果如下:

.NET中的泛型和Java泛型中的類型擦除

Java泛型中的類型擦除

 經(jīng)常聽人說起Java的泛型是偽泛型,因為在編譯或運(yùn)行期間,java的JIT會對進(jìn)行類型擦除。即JVM無法真正識別出泛型類型,因此在真正運(yùn)行前會把泛型類型轉(zhuǎn)換成原始類型。因此,所有的泛型類型,本質(zhì)上都共享同一個類型對象。比如List類型在擦除后變成非泛型的List,這個List可以存放任何類型的數(shù)據(jù)。因此,Java在運(yùn)行的時候,無法獲得類型。當(dāng)然,使用反射也許可以知道,但是并不保證總是能夠得到類型。因此在Java代碼中,不同的泛型類型其實(shí)都是出自相同的類型。例如下面代碼:

  1. publicstaticvoidthrows
  2. new
  3. new
  4. boolean
  5. //true
  6. //java.util.ArrayList
  7. //java.util.ArrayList

也正是由于代碼擦除,使得泛型類型本質(zhì)上都是共享同一個類型對象,因此類型的靜態(tài)字段也是共享的。例如下面代碼:

  1. publicclass
  2. publicstaticint0
  3. public
  4. publicstaticvoidthrows
  5. new
  6. new

最終運(yùn)行的結(jié)果是2.


參考文檔:Microsoft.Press.CLR.via.Csharp.4th.Edition.Oct.2012.

https://en.wikipedia.org/wiki/Generics_in_Java.

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


分享文章:.NET中的泛型和Java泛型中的類型擦除-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://weahome.cn/article/gdsjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部