国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      將泛型類分解成層的制作方法

      文檔序號:11142218閱讀:286來源:國知局
      將泛型類分解成層的制造方法與工藝

      本發(fā)明一般地涉及軟件開發(fā),并且更具體地講,涉及各種編程語言中的任何編程語言(諸如,作為一個示例,獨立于平臺的面向?qū)ο蟮木幊陶Z言)內(nèi)的語言開發(fā)的各種方面。

      許多編程語言支持參數(shù)多態(tài),諸如Java、C#和Scala中的泛型類。經(jīng)常利用關(guān)于泛型域的假設(shè)編寫泛型類。經(jīng)常地,這種假設(shè)在編程語言內(nèi)是顯式的,而其它假設(shè)是隱式的。例如,在Java編程語言內(nèi),傳統(tǒng)上在假設(shè)類型變量僅在引用類型的范圍上變化的情況下編寫泛型類。這些假設(shè)經(jīng)常被結(jié)合到這些類的實現(xiàn)方式。例如,對于具有聲明List<T>的泛型類,開發(fā)者可在假設(shè)T必須是引用類型的情況下編寫代碼。然而,關(guān)于受限域的假設(shè)使得在更廣泛的域(諸如,既包括引用類型又包括原始類型的域)上泛型化的能力更加困難或者成問題。



      技術(shù)實現(xiàn)要素:

      這里描述了各種實施例,這些實施例增強面向?qū)ο蟮能浖_發(fā),以包括用于對泛型類執(zhí)行分解的語言和/或運行時支持,從而支持將其泛型性擴展至更大的域,并且同時保持與已有實現(xiàn)方式和客戶機的兼容性(例如,二進制、源和/或行為兼容性)。

      這里描述的技術(shù)可涉及將泛型類“剝離”成多個層。例如,泛型類可被“剝離”為包括可在擴展域上被視為泛型的一個完全泛型層和可被限制于先前域的另一層(例如,作為一個示例,引用特定)。存在問題的方法(例如,具有關(guān)于泛型域的內(nèi)置假設(shè)的方法)可被移動到與先前(例如,更加限制性的)泛型域?qū)?yīng)的層中,由此保留與當(dāng)前將這些方法實例化或引用這些方法的類的兼容性,并且同時仍然允許在擴展的泛型域內(nèi)使用。

      可通過允許創(chuàng)建類的細分版本來以兼容方式擴展已有泛型類型的泛型域,所述類的細分版本包括多個層,諸如支持擴展域的完全泛型層以及可能不完全支持擴展的泛型域的其它層。例如,Java編程語言可被增強以允許創(chuàng)建細分泛型類,所述細分泛型類包括支持除引用類型之外的類型的完全泛型層和支持先前(例如,僅引用)泛型域的層。

      所述類的細分版本還可包括指示特定類成員位于哪個層中的信息。在一些實施例中,針對與擴展的泛型域?qū)?yīng)的類型(例如,引用類型、原始類型、值類型、元組類型等)和與先前泛型域?qū)?yīng)的類型(例如,在Java示例中,僅引用類型),可加載、實例化和/或特化單個細分泛型類。

      因此,根據(jù)一些實施例,使用具有多個層的泛型類可允許將泛型域擴展為包括另外的類型(例如,不僅僅包括所有的引用類型,還包括原始類型和/或所有的值類型),同時保持與已有實現(xiàn)方式和客戶機的兼容性。

      附圖說明

      圖1是表示根據(jù)各種實施例的用于編譯和執(zhí)行按照高級的面向?qū)ο蟮恼Z言指定并且被配置為支持將泛型類分解成層的計算機程序的工作流程的邏輯方框圖。

      圖2是表示根據(jù)一個實施例的包括多個層的細分泛型類的創(chuàng)建的邏輯方框圖。

      圖3是表示根據(jù)一個實施例的用于創(chuàng)建既包括完全泛型層又包括引用特定層的細分類的方法的一個實施例的流程圖。

      圖4是表示根據(jù)一個實施例的既包括完全泛型層又包括引用特定層的泛型類的一個示例的邏輯方框圖。

      圖5是表示在一個實施例中的基于細分泛型類的類的實例化的邏輯方框圖。

      圖6是表示根據(jù)一個實施例的用于加載細分泛型類的完全泛型版本的方法的一個實施例的流程圖。

      圖7是表示根據(jù)一個實施例的用于加載細分泛型類的引用特定版本的方法的一個實施例的流程圖。

      圖8是表示根據(jù)一個實施例的用于針對非引用類型參數(shù)化將細分泛型類特化的方法的一個實施例的流程圖。

      圖9是表示根據(jù)一個實施例的適合實現(xiàn)將泛型類分解成層的示例性計算機系統(tǒng)的邏輯方框圖。

      具體實施方式

      這里描述了各種實施例,這些實施例增強使用面向?qū)ο蟮恼Z言的軟件開發(fā)(諸如,增強JavaTM編程語言),以支持對泛型類執(zhí)行分解,從而支持與已有實現(xiàn)方式和客戶機的二進制、源和/或行為兼容性,并且同時仍然支持其泛型擴展至更大的域。根據(jù)一些實施例,泛型域可表示由泛型類支持的不同類型的范圍。

      一些實施例中,將泛型類分解成兩個或更多個層可被稱為“剝離”。例如,泛型類可被“剝離”成多個層,諸如可在擴展域上被視為泛型的一個泛型層(例如,完全泛型)和可被限制于先前域的一個層(例如,引用特定)。存在問題的方法(例如,具有關(guān)于泛型域的內(nèi)置假設(shè)的方法)可被移動到第二個引用特定層中,由此保留與當(dāng)前將那些方法實例化或引用那些方法的類的兼容性,并且同時仍然允許在擴展的泛型域內(nèi)使用。

      例如,在一些實施例中,編程語言可被增強以便通過支持包括多個層的類的細分版本的創(chuàng)建來以兼容方式擴展已有泛型類型的泛型域。例如,在一個實施例中,類可被細分為用于一個或多個類成員的抽象版本的泛型層和用于在泛型層中抽象的成員的非抽象版本的對象(或引用特定)層。類的細分版本可包括指示特定成員位于哪個層中的信息。另外,運行時環(huán)境可將細分泛型類加載、實例化和/或特化。在一些實施例中,對于引用類型和非引用類型,相同的細分泛型類可被加載、實例化和/或特化。

      因此,根據(jù)一些實施例,將泛型類剝離成多個層可允許將泛型域擴展為不僅包括所有的引用類型,還包括原始類型和/或所有的值類型,同時保持與已有實現(xiàn)方式和客戶機的兼容性。例如,在一個實施例中,在Java編程語言內(nèi),如這里所述,剝離的使用可允許在T是引用類型、原始類型和/或值類型的情況下將泛型類List<T>特化。在另一實施例中,在支持類、函數(shù)和元組的三重系統(tǒng)(諸如,F(xiàn)ortressTM系統(tǒng))內(nèi),類可被細分為多個層以支持泛型的不同級別。例如,細分類可包括用于類、函數(shù)和/或元組的層以及更細粒度的層以便諸如支持特定情況(例如,int、numeric、“T extends Comparable”等)。

      在下面的詳細描述中,闡述許多特定細節(jié)以提供對要求保護的主題的徹底的理解。然而,本領(lǐng)域技術(shù)人員將會理解,可在沒有這些特定細節(jié)的情況下實施要求保護的主題。在其它實例中,因為本領(lǐng)域普通技術(shù)人員知道方法、設(shè)備或系統(tǒng),所以以下未詳細地描述所述方法、設(shè)備或系統(tǒng)以免模糊要求保護的主題。

      盡管對于幾個實施例和說明性附圖作為示例在這里描述了各種實施例,但本領(lǐng)域技術(shù)人員將會意識到,實施例不限于描述的實施例或附圖。應(yīng)該理解,附圖及其詳細描述并不意圖將實施例限制于公開的特定形式,而是相反地,意圖包括落在本公開的精神和范圍內(nèi)的所有變型、等同物和替代物。這里使用的任何標題僅用于組織目的,而非意圖用于限制該描述的范圍。如在整個本申請中所使用,在許可意義(即,意味著具有可能性)而非強制性意義(即,意味著必須)上使用詞語“可”。類似地,詞語“包括”、“包含”和“具有”表示包括但不限于。

      按照對存儲在特定設(shè)備或?qū)S糜嬎阊b置或平臺的存儲器內(nèi)的二進制數(shù)字信號的操作的算法或符號表示,提供下面的詳細描述的一些部分。在這個特定說明書的上下文中,一旦通用計算機被編程為根據(jù)來自程序軟件的指令執(zhí)行特定功能,則術(shù)語特定設(shè)備等包括所述通用計算機。算法描述或符號表示是由信號處理或相關(guān)領(lǐng)域普通技術(shù)人員用于將他們的工作的實質(zhì)傳達給其他本領(lǐng)域技術(shù)人員的方法的示例。算法在這里通常被視為導(dǎo)致預(yù)期結(jié)果的前后一致的一系列操作或類似信號處理。在這種情況下,操作或處理涉及物理量的物理操縱。通常,但并非必然,這種量可采取能夠被存儲、傳送、組合、比較或以其它方式操縱的電信號或磁信號的形式。有時,主要由于常用的原因,已證明將這種信號稱為位、數(shù)據(jù)、值、元素、碼元、字符、項、數(shù)、數(shù)字等是比較方便的。然而,應(yīng)該理解,所有這些或類似術(shù)語應(yīng)該與合適的物理量關(guān)聯(lián)并且僅是方便的標簽。除非另外具體地指出,否則從下面的討論清楚可知,應(yīng)該理解,在本說明書中,使用諸如“處理”、“計算”、“核算”、“確定”等的術(shù)語的討論始終表示特定設(shè)備(諸如,專用計算機或類似專用電子計算裝置)的動作或處理。因此,在本說明書的上下文中,專用計算機或類似專用電子計算裝置能夠操縱或變換在專用計算機或類似專用電子計算裝置的存儲器、寄存器或其它信息存儲裝置、傳輸裝置或顯示裝置內(nèi)通常表示為物理電子量或磁量的信號。

      根據(jù)各種實施例,這里描述的方法和/或特征可涉及語言開發(fā)的各種方面,諸如例如包括用于在Java虛擬機(JVM)中描述動態(tài)派生類的基礎(chǔ)支持、用于將語言級別概念翻譯成JVM能夠執(zhí)行的字節(jié)碼的Java編譯器中的翻譯機構(gòu)、和用于表示以前不能表示的事物的在Java語言中暴露的特征。根據(jù)Java編程語言和/或使用利用Java編程語言的軟件開發(fā)的特征討論這里描述的方法、技術(shù)、特征和/或增強的各種實施例。然而,根據(jù)各種實施例,這里描述的方法、技術(shù)、特征和其它增強也可被與其它編程語言(諸如,C、C++、C#、Python)一起使用。

      另外,如這里所提及,類可被視為用戶定義的類型或數(shù)據(jù)結(jié)構(gòu),所述用戶定義的類型或數(shù)據(jù)結(jié)構(gòu)可包括數(shù)據(jù)、變量、函數(shù)、方法和/或其它屬性作為成員并且代表用于創(chuàng)建特定類型的編程對象的定義、藍圖或模板。類可為數(shù)據(jù)成員提供初始值并且為成員函數(shù)和方法提供實現(xiàn)方式。類經(jīng)常被包括在庫中。如這里所提及,庫可被視為由軟件程序或應(yīng)用使用的一批資源。根據(jù)一些實施例,庫可包括各種類型的資源中的任何資源,包括但不限于數(shù)據(jù)、文件、類、子程序和/或類型規(guī)范。庫可被組織以便由超過一個應(yīng)用(可能同時)使用,并且可通過提供資源來提升可重用性,以使得應(yīng)用可不必實現(xiàn)(或重新實現(xiàn))相同行為。

      現(xiàn)在參照圖1,圖1表示根據(jù)各種實施例的用于編譯和執(zhí)行按照高級的獨立于平臺的面向?qū)ο蟮恼Z言指定的支持原始和引用數(shù)據(jù)類型以及關(guān)于如這里所述的將泛型類分解成層的各種方法、特征和增強的計算機程序的工作流程。為了說明的目的,主要在使用JavaTM編程語言的情況下提供下面的描述。然而,需要注意的是,描述的技術(shù)可被與在任何合適的情況下支持原始和引用類型和特化的幾乎任何編程語言一起使用。

      根據(jù)示出的實施例,當(dāng)編譯器(諸如,編譯器120)接收到用于計算機程序的源代碼(諸如,源代碼文件110)時,工作流程可開始。在各種實施例中,可按照各種高級和/或獨立于平臺的面向?qū)ο蟮木幊陶Z言(諸如,JavaTM和/或其它語言)指定源代碼文件110。例如,在使用JavaTM的實施例中,源代碼可被提供作為一組.java文件。類似地,在使用C++的實施例中,源代碼可被提供作為一組.cpp文件。在一些實施例中,可使用語言的組合指定源代碼文件110,所述組合可包括一種或多種低級和/或中間語言(例如,匯編)。在一些實施例中,可最初按照動態(tài)類型的高級語言(諸如,Python或Ruby)編寫至少一些源代碼,而在其它實施例中,所有的源代碼可以按照靜態(tài)類型的語言(諸如,JavaTM)編寫。

      在描述的實施例中,編譯器120可分析源代碼文件110以產(chǎn)生字節(jié)碼文件或程序的可執(zhí)行版本,諸如類文件130(例如,在JavaTM的情況下的.class文件或.jar文件)。不同類型的可執(zhí)行代碼格式可被用于各種實施例;例如,可替代于字節(jié)碼而使用二進制機器語言。在一些場景中,類文件130中的可執(zhí)行代碼的一部分可以是字節(jié)碼,而其它部分是原生二進制機器語言。

      根據(jù)一些實施例,作為將程序源代碼文件110編譯為類文件130的一部分,編譯器120可執(zhí)行一系列分析操作并且在產(chǎn)生可執(zhí)行版本之前產(chǎn)生各種中間數(shù)據(jù)結(jié)構(gòu),以便諸如應(yīng)用或?qū)崿F(xiàn)將泛型類分解成層。例如,編譯器可在創(chuàng)建類文件130時產(chǎn)生一個或多個細分類(例如,已被剝離成多個層的類)。如上所述,編程語言可被修改以允許泛型類被以兼容方式分解(或“剝離”)成多個層,一個層在擴展域上是泛型的(例如,完全泛型),并且一個層被限制于先前域(例如,引用特定)。因此,編譯器120可被修改以通過實現(xiàn)各種編程語言特征來支持擴展的泛型域,允許開發(fā)者創(chuàng)建新類(或修改已有類),同時保持與已有實現(xiàn)方式的兼容性,所述新類(或已有類)包括多個泛型層,如以下更詳細所討論。

      如圖1中所示,類文件130可被傳送給執(zhí)行環(huán)境,諸如虛擬化運行時環(huán)境140,虛擬化運行時環(huán)境140在執(zhí)行平臺102上執(zhí)行代碼,由此創(chuàng)建各種輸出數(shù)據(jù)和/或行為。根據(jù)各種實施例,虛擬化運行時環(huán)境140又可包括許多不同部件,諸如類加載器150、存儲管理器160、字節(jié)碼校驗器170(例如,用于檢查可執(zhí)行代碼的有效性)和/或解釋器和/或即時(JIT)編譯器180。在一些實施例中,JIT編譯器可負責(zé)將一些或全部的字節(jié)碼(例如,字節(jié)碼的大量使用的部分)翻譯成平臺特定機器代碼以提高程序執(zhí)行的性能。在一些實施例中,虛擬化運行時環(huán)境140還可包括用于實現(xiàn)許多應(yīng)用編程接口(API)庫190的代碼。在一些實施例中,虛擬化運行時環(huán)境140可在低層軟件(諸如,操作系統(tǒng)192)上運行。

      在不同實施例中,作為編譯代碼的執(zhí)行的結(jié)果產(chǎn)生的輸出或行為可包括存儲在各種級別的系統(tǒng)存儲器中的數(shù)據(jù)(例如,內(nèi)存對象和/或數(shù)據(jù)結(jié)構(gòu))、存儲在持久存儲裝置上的數(shù)據(jù)(例如,文件系統(tǒng)中的文件)等。所述行為還可包括各種程序功能,諸如在屏幕上顯示輸出、經(jīng)網(wǎng)絡(luò)發(fā)送消息和/或以其它方式與各種用戶和/或部件交互。

      面向?qū)ο蟮木幊虄?nèi)的參數(shù)多態(tài)涉及泛型類型、方法和類。例如,在JavaTM編程語言內(nèi),泛型類型是由一組類型參數(shù)參數(shù)化的泛型類或接口。傳統(tǒng)上,泛型類被定義為具有類型參數(shù)部分,所述類型參數(shù)部分跟隨在類名后面,由角括號(<>)定界。所述參數(shù)部分指定類型參數(shù)(也被稱為類型變量)。為了更新非泛型類以使用泛型,可通過引入類型變量T來創(chuàng)建泛型類型聲明,能夠在類內(nèi)部的任何地方使用類型變量T。類聲明內(nèi)的Object的一個、一些或全部出現(xiàn)(例如,根據(jù)特定情況)可被T替換。類似地,泛型方法也可被一組類型參數(shù)參數(shù)化。傳統(tǒng)上,類型變量能夠是任何非原始類型(例如,任何類類型、任何接口類型、任何陣列類型甚至另一類型變量)。然而,通過應(yīng)用這里描述的方法和/或技術(shù),泛型域可被擴展為包括另外的類型(例如,原始類型、值類型、函數(shù)類型、元組類型等),同時保持與已有實現(xiàn)方式的兼容性。

      如上所述,經(jīng)常利用關(guān)于泛型域的假設(shè)編寫泛型類。然而,如這里所述,根據(jù)各種實施例,該限制可被解除以允許泛型類型參數(shù)在無限的一組全部類型上或在受限的一組類型上變化,所述一組類型包括不在先前泛型域中的至少一個類型(例如,在基于Java的示例中,不是引用,諸如int)。在一些實施例中,解除這個限制可能需要通過提取(例如,分層和/或重構(gòu))應(yīng)用于所有類型參數(shù)分派(諸如,int或float以及Object或String)的結(jié)構(gòu)(例如,類成員),同時留下局限于僅對引用進行操作的那些結(jié)構(gòu)(諸如,Object或String),來改進已對其泛型域做出顯式假設(shè)的已有類型。

      根據(jù)一些實施例,可對泛型類執(zhí)行分解以支持與已有實現(xiàn)方式和客戶機的兼容性,同時仍然支持其泛型擴展至更大的域。這個技術(shù)可在這里被稱為“剝離”,因為它可采用泛型類并且將其剝離成多個層(例如,在擴展域上是泛型的一個層和被限制于先前域的一個(或多個)層)。因此,在一些實施例中,存在問題的方法可被移動到不同層中,由此保留與當(dāng)前將它們實例化或引用它們的類的兼容性,并且同時仍然允許在擴展的泛型域內(nèi)使用。

      在一些實施例中,一些類可能不需要被細分,因為它們可能不包括關(guān)于更加受限的泛型域的假設(shè)(例如,被利用關(guān)于更加受限的泛型域的假設(shè)開發(fā))。換句話說,一些類可能已經(jīng)支持更廣泛的泛型域。然而,其它類可能具有關(guān)于受限的泛型域的假設(shè),并且因此可能需要大量修改(例如,細分)以支持擴展的泛型域。在其它實施例中,類可被開發(fā)為使得類的多數(shù)功能可被包括在任何細分層中,但某些方法可被包括(例如,“限制”)在引用層中,同時可在細分類內(nèi)的一個或多個其它層中包括新的泛型方法以提供相同的功能。

      因此,在一些實施例中,編譯器120可被配置為通過允許創(chuàng)建類的細分版本來支持已有泛型類型的擴展的泛型域,所述類的細分版支持擴展的泛型并且也保持已有泛型類的兼容性(例如,源兼容性、二進制兼容性和/或行為兼容性)。在各種實施例中,可存在超過一種類型的兼容性,諸如源兼容性、二進制兼容性和/或行為兼容性。源兼容性可允許引用修改的類的源文件在已做出改變之后繼續(xù)被編譯。二進制兼容性可允許鏈接到修改的類的二進制文件在已做出改變之后繼續(xù)合適地鏈接。行為兼容性可允許在修改類之前提供的功能與在修改類之后提供的功能相同。

      如以下更詳細所解釋,根據(jù)一些實施例,類的細分版本可包括包含一個或多個類成員的版本的泛型層和與由可包括泛型層中的成員的其它版本的類支持的先前泛型域?qū)?yīng)的層。在一個實施例中,編譯器120可在類的細分版本中包括指示支持擴展的泛型的成員(例如,位于泛型層中的成員)和不支持擴展的泛型的至少一部分的成員(例如,位于對象層中的成員)的信息(例如,裝飾(adornment)、屬性、元數(shù)據(jù)等)。

      在一些實施例中,虛擬化運行時環(huán)境140可被配置為將細分(例如,多層或剝離)的泛型類加載、實例化和/或特化。例如,在一些實施例中,虛擬化運行時環(huán)境140可被配置為將細分泛型類的完全泛型版本(例如,針對非引用類型實例化的泛型類的版本)加載和/或?qū)嵗n愃频?,在另一實施例中,虛擬化運行時環(huán)境140可被配置為將與先前泛型域?qū)?yīng)的相同的細分泛型類的版本加載和/或?qū)嵗?例如,針對引用類型實例化的泛型類的版本)。因此,根據(jù)各種實施例,虛擬化運行時環(huán)境140可被配置為既加載和/或?qū)嵗毞址盒皖惖耐耆盒桶姹?,又加載和/或?qū)嵗毞址盒皖惖牟煌耆盒桶姹尽?/p>

      另外,在一些實施例中,虛擬化運行時環(huán)境140可被配置為對于各種參數(shù)化的特化細分泛型類。例如,在一個實施例中,虛擬化運行時環(huán)境140可被配置為對于引用類型、原始類型、值類型和/或?qū)τ趲缀跞魏晤愋吞鼗瘑蝹€細分泛型類。

      作為一個示例,在一些實施例中,剝離(例如,將泛型類分解成多個層)可涉及將兩個層引入到泛型類:完全泛型層和與先前泛型域?qū)?yīng)的一個層(例如,特定于利用T extends Object的實例化的引用特定層),由此擴展類的泛型域,同時保持與已有實現(xiàn)方式的兼容性。剝離可被視為用于以兼容方式重寫具有不完整或不一致的泛型的庫類的技術(shù)。例如,傳統(tǒng)泛型類是在假設(shè)它們將會僅應(yīng)用于引用類型的情況下使用Java編程語言編寫的。

      在一些實施例中,將泛型類分解成多個層(例如,剝離)可包括:即使已有泛型類的一個或多個成員不支持擴展的泛型的至少一部分,也以兼容方式擴展所述類的泛型域。類的所述一個或多個成員可包括方法、字段、構(gòu)造器和/或嵌套類型中的一個或多個??蓜?chuàng)建在一個或多個層中包括類的所有成員的類的細分版本。

      圖2是表示根據(jù)一個實施例的包括多個層的細分泛型類的創(chuàng)建的邏輯方框圖。如圖2中所示,已有泛型類聲明200可包括一個或多個類成員210。為了以兼容方式擴展泛型類的泛型域,如箭頭220所指示,可產(chǎn)生細分泛型類聲明230。例如,在一個實施例中,可在假設(shè)僅引用域的情況下,諸如在假設(shè)變量類型(用于泛型類的變量類型)僅在引用類型上變化的情況下,編寫已有類聲明200。為了將泛型域從僅引用域擴展到更大的域(例如,引用類型以及值類型),已有泛型類聲明200可被重寫以產(chǎn)生細分泛型類聲明230。如上所述,細分類可包括多個層。根據(jù)由圖2示出的實施例,細分泛型類聲明230已被細分或“剝離”為包括泛型層240和與先前泛型域(例如,僅引用)對應(yīng)的對象層250。

      根據(jù)一個實施例,下面的示例性偽代碼可代表已有泛型類聲明200:

      在以上的示例性代碼中,可能已利用關(guān)于泛型域的假設(shè)編寫方法void foo(T t),并且因此,方法void foo(T t)可能不支持擴展的泛型域。因此,像下面的示例性偽代碼中一樣,以上的示例性類可被分解或剝離成諸如由細分泛型類聲明230表示的細分泛型類:

      其接口和/或?qū)崿F(xiàn)方式不適合(例如,不支持)擴展的泛型域的已有方法可被放到限制于先前域的層中。例如,在以上示例中,方法foo(T t)已被移動到引用特定層中。根據(jù)一些實施例,如以上示例中所示,可使用“l(fā)ayer”關(guān)鍵字指示類的不同層。然而,在其它實施例中,類的層可被以不同方式指示。例如,能夠使用不同語法編寫以上示例以指示引用特定層:

      因此,如以下更詳細所解釋,在不同實施例中,可使用不同機制指示分解(例如,剝離)的類內(nèi)的各個層。

      泛型層240可包括完全泛型類成員260,當(dāng)針對擴展的泛型域的類型(例如,除僅僅引用類型之外的類型)對泛型類進行實例化(或特化)時可使用完全泛型類成員260。在一個示例性實施例中,對象層250可以是包括受限方法成員270的引用特定層,受限方法成員270可被限制于針對引用類型對泛型類進行實例化(或特化)。盡管圖2中示出的細分泛型類聲明230包括兩個層(例如,泛型層和對象層),但在其它實施例中,細分類可包括超過兩個層以支持不同泛型域(例如,引用類型、原始類型、值類型、函數(shù)類型、元組類型等)。另外,細分泛型類內(nèi)的不同層可包括不同類成員,諸如不同方法。例如,根據(jù)一些實施例,泛型層240可包括一個或多個類成員的抽象版本,而對象層250可包括在泛型層240中抽象的至少一些類成員的非抽象版本。

      因此,在一些實施例中,編程語言可被增強以擴展泛型域,從而允許創(chuàng)建支持擴展的泛型并且同時保持與已有泛型類的兼容性(例如,源兼容性、二進制兼容性和/或行為兼容性)的類的細分版本。在一個實施例中,類信息(例如,裝飾、屬性、元數(shù)據(jù)等)的細分版本指示支持擴展的泛型的成員(例如,位于完全泛型層中的成員)和不支持擴展的泛型的至少一部分的成員(例如,位于與先前泛型域?qū)?yīng)的層中的成員)。

      圖3是表示根據(jù)一個實施例的用于創(chuàng)建既包括完全泛型層又包括引用特定層的細分類的方法的一個實施例的流程圖。如塊300中所示,根據(jù)一些實施例,即使一個或多個類成員不支持擴展的泛型的至少一部分,包括一個或多個類成員的已有泛型類的泛型域也可被以兼容方式擴展。例如,如上所述,已有類聲明200可包括一個或多個類成員210,所述一個或多個類成員210中的至少一個類成員可能不支持擴展的泛型。例如,可能已利用類將會僅在引用類型上是泛型的假設(shè)編寫已有類聲明200,并且因此,至少一個類成員可能不支持將泛型域擴展為包括原始(或其它非引用)類型。

      根據(jù)各種實施例,如塊310中所示,擴展已有類的泛型域可包括創(chuàng)建支持擴展的泛型并且保持與已有泛型類的兼容性的類的細分版本,并且還可涉及在類的細分版本中包括識別不支持擴展的泛型的至少一部分的所述一個或多個成員的一個或多個指示器,如塊320中所示。例如,細分泛型類聲明230可被產(chǎn)生,并且可包括識別類的完全泛型成員260和/或識別類的受限成員270的各種指示器。根據(jù)不同實施例,如以下參照圖4更詳細所解釋,細分泛型類聲明230可包括各種類型的指示器中的任何類型的指示器。

      因此,根據(jù)一些實施例,可在逐個成員的基礎(chǔ)上充分地區(qū)分不同層。另外,各種層還可通過子/超關(guān)系而合適地相關(guān),在一些實施例中,這可能需要用于將超類型成員繼承到子類型層中的詳細規(guī)則。在一些實施例中,這種關(guān)系可允許軟件重新使用的多個層。

      例如,支持擴展的泛型域的新編寫的程序可重新使用泛型層240(例如,擴展或超類型層),而能夠接受先前泛型域(例如,僅引用限制)的已有程序(或代碼庫)可使用對象層250(例如,受限或子類型層),并且因此,可能不需要修改。例如,在一些實施例中,泛型類ArrayList<T>可與原始類型(諸如,int)以及與引用類型(諸如,String)一起使用。當(dāng)如這里所述使用剝離時,泛型類(諸如,ArrayList)的泛型域可被擴展為包括原始和/或值類型,而不必重寫在假設(shè)泛型類ArrayList可僅與引用類型一起使用(例如,利用引用類型實例化或特化)的情況下使用ArrayList的已有代碼(例如,類、應(yīng)用、庫等)。

      根據(jù)一些實施例,通過使與先前泛型域?qū)?yīng)的層(例如,對象層或受限層)在功能上與泛型類的傳統(tǒng)已有類型相同,可提供向后兼容。根據(jù)各種實施例,分層/分解的另外的應(yīng)用還可提供其它益處,諸如用于舊(受限邊界)和新(不受限)系統(tǒng)中的類型的特化的實現(xiàn)方式。

      另外,在一些實施例中,類可包括類型特定的一個或多個層,如下面的示例性偽代碼中所示:

      類的細分版本還可包括用于不支持擴展的泛型的至少一部分的類成員的特殊處理的指令,并且類成員的特殊處理可保持與類的已有使用的兼容性(例如,源兼容性、二進制兼容性和/或行為兼容性)。在一些實施例中,例如,用于特殊處理的指令可至少部分地由類的過載方法的靜態(tài)或動態(tài)類型的輸入觸發(fā)。

      圖4是表示根據(jù)一個實施例的具有多個層的泛型類的一個示例的邏輯圖。如圖4中所示,編譯器120可被配置為支持從已有泛型類400產(chǎn)生(如箭頭410所指示)細分泛型類420。例如,在一些實施例中,泛型類400(諸如,ListLike<T>)可在邏輯上被劃分或“剝離”成兩個層——泛型層430和引用特定或?qū)ο髮?40。泛型層430可在擴展的泛型上是泛型的,而對象層440可特定于類型變量的先前泛型域(例如,在由圖4示出的實施例中,引用實例化),從而保持與已有實現(xiàn)方式和客戶機的兼容性。

      在一些實施例中,對于類使用多個層可以使得能夠在特化內(nèi)處理原始類型和引用類型之間(諸如,replace(int)和replace(T)之間)的潛在沖突。當(dāng)將已有泛型類遷移到具體化、擴展或特化的泛型時,已有泛型類可能具有兼容性問題。例如,在使用擴展的泛型域進行特化的情況下,傳統(tǒng)上有效的某些過載可能變得存在問題。例如,下面的示例性代碼:

      在假設(shè)T代表引用類型的情況下是非常好的,但當(dāng)泛型被擴展以使得T可采用值或原始類型(例如,int)時,這可能變得存在問題,因為可能無法區(qū)分這兩種remove方法。利用取決于用于引用T的ListLike<T>的代碼的主體,在不破壞兼容性的情況下,以上示例中的remove方法都可能無法被去除或重新命名。然而,可能需要在特化側(cè)(例如,產(chǎn)生什么方法)以及在過載選擇(例如,調(diào)用哪個方法)上解決這些方法。換句話說,根據(jù)一些實施例,當(dāng)產(chǎn)生特化的代碼時以及當(dāng)編譯客戶機代碼時,都可消費(例如,使用)分層信息。

      例如,考慮以上使用的List-like類示例中的過載對:

      ListLike的傳統(tǒng)(例如,舊)使用可隱含地取決于T的域不包括int(例如,因為int是非引用類型)的事實,并且因此,可僅包括引用實例化(例如,因為這可以是在以前僅允許的實例化)。因此,兼容性可能需要引用實例化具有全部這些方法,但可能不需要關(guān)于非引用實例化的任何事情(例如,因為可能在傳統(tǒng)上全都不存在)。

      然而,在一些實施例中,擴展泛型域可以使得能夠在擴展的泛型域內(nèi)處理原始類型和引用類型之間(諸如,replace(int)和replace(T)之間)的潛在沖突。例如,以上ListLike示例性代碼在建設(shè)T代表引用類型的情況下是非常好的,但當(dāng)泛型被擴展以使得T可采用值或原始類型(例如,int)時,這可能變得存在問題,因為可能無法區(qū)分這兩種remove方法。例如,利用取決于用于引用T的ListLike<T>的代碼的主體,在不破壞兼容性的情況下,以上示例中的remove方法都可能無法被去除或重新命名。

      然而,在一些實施例中,剝離可允許示例性ListLike類被如圖4中所示并且像下面的示例性代碼中一樣重寫:

      ListLike的細分版本可包括一個或多個指示器,所述一個或多個指示器指示哪些成員是完全泛型的以及哪些成員不支持ListLike的細分版本的擴展的泛型。根據(jù)各種實施例,各種方法中的任何方法可被用于指示方法(和/或類的其它成員)在所有類型上是泛型的以及它們被包括在泛型層430中。在一些實施例中,完全泛型層430中的方法(或方法聲明)可被注釋(例如,使用各種裝飾中的任何裝飾)以指示:它們在所有類型上是泛型的,而非僅在引用類型上是泛型的。在一個實施例中,所述方法聲明可被利用一個或多個特殊標記、符號和/或關(guān)鍵字裝飾,而在其它實施例中,特定元數(shù)據(jù)(例如,在實際方法聲明內(nèi)或與實際方法聲明分開)可指示:特定方法聲明在所有類型上是泛型的。在另一實施例中,另外的屬性和/或元數(shù)據(jù)可被添加到所述類,指示哪些方法是完全泛型的。

      另外,在一些實施例中,細分類420可包括識別位于與先前泛型域?qū)?yīng)的層中的類成員的指示器。如上所述,根據(jù)各種實施例,各種方法、方式和/或語法中的任何方法、方式和/或語法可被用于指示方法(和/或類的其它成員)僅在先前(受限)泛型域內(nèi)是泛型的并且它們被包括在對象層440中。例如,一些實施例中,對象層440中的方法(或方法聲明)可被注釋(例如,使用各種裝飾中的任何裝飾)以指示:它們僅對于引用類型是泛型的。在一個實施例中,所述方法聲明可被利用一個或多個特殊標記、符號和/或關(guān)鍵字裝飾,而在其它實施例中,特定元數(shù)據(jù)(例如,在實際方法聲明內(nèi)或與實際方法聲明分開)可指示:所述特定方法聲明僅在先前(受限)泛型域內(nèi)是泛型的。在另一實施例中,另外的屬性和/或元數(shù)據(jù)可被添加到所述類,指示哪些方法僅在先前泛型域內(nèi)是泛型的。

      在其它實施例中,指示器可被添加以識別僅在一個層中的成員(例如,其它層中的成員可被識別為不在指示的層中的那些成員)。另外,不同類型的指示器和/或語法可被用在不同實施例中并且用于指示同一個類內(nèi)的不同類型的成員。

      在一些實施例中,類的細分版本可包括包含類的一個或多個成員的抽象版本的泛型層和包括在泛型層中抽象的至少一個類成員的非抽象版本的與先前泛型域?qū)?yīng)的層。泛型層430可包括抽象方法,諸如remove(T)和removeAt(int)。在一些實施例中,針對T=int新特化的類可對于這些抽象方法而言沒有問題。引用特定(例如,對象)層440還可包括(或添加)抽象方法(諸如,示例性remove(int))以及來自泛型層的一個或多個方法的具體實現(xiàn)方式(諸如,remoteAt(int)方法)。在一些實施例中,使用ListLike<T>(其中T擴展了Object)的已有代碼可看見熟悉的remove(Object)和remove(int)方法,由此提供兼容性。換句話說,已有類文件將會發(fā)現(xiàn)它們尋找的方法(例如,二進制兼容性),并且已有客戶機和實現(xiàn)方式能夠被針對更新的庫重新編譯而沒有不良作用(例如,源兼容性)。另外,針對非引用類型(諸如,int)的ListLike<T>的特化可看見一對無問題的方法remove(T)和removeAt(int)。

      已有實現(xiàn)方式(例如,不支持擴展的泛型域)可預(yù)期存在remove(T)和remove(int),并且可預(yù)期它們是抽象的,同時預(yù)期不會看見新的抽象方法(例如,所述新的抽象方法的存在可引起編譯器錯誤)。根據(jù)一個示例性實施例,通過在引用層中包括remove(int)的聲明和removeAt(int)的實現(xiàn)方式,可保持與已有實現(xiàn)方式的兼容性。換句話說,引用實例化可具有remove(T)和remove(int)以及新的removeAt(int),由此可確保兼容性,而特化可具有remove(T)和removeAt(int)的(非問題)過載。因此,根據(jù)一些實施例,ListLike的已有實現(xiàn)方式可繼續(xù)編譯(即使它們不支持擴展的泛型域),因為新方法removeAt(int)具有用于引用特化的默認值。然而,根據(jù)一些實施例,對于原始特化,removeAt可被視為抽象并且可能需要提供removeAt,但remove可能根本不存在。

      在一些實施例中,對象層440中所包括的方法(或其它類成員)(例如,僅在引用類型上是泛型的那些方法(或其它類成員))可被視為抽象和不抽象。例如,使用以上的ListLike示例,一些方法(例如,以上示例中的remove)可在T是引用的情況下實現(xiàn),但在T是值的情況下可能無法實現(xiàn)。

      在一些實施例中,虛擬化運行時環(huán)境140可被配置為將細分(例如,多層或剝離)的泛型類加載、實例化和/或特化。例如,在一些實施例中,虛擬化運行時環(huán)境140可被配置為將細分泛型類的完全泛型版本(例如,針對非引用類型實例化的泛型類的版本)加載和/或?qū)嵗?。類似地,在另一實施例中,虛擬化運行時環(huán)境140可被配置為將與先前泛型域?qū)?yīng)的相同的細分泛型類的版本(例如,針對引用類型實例化的泛型類的版本)加載和/或?qū)嵗?。因此,根?jù)各種實施例,虛擬化運行時環(huán)境140可被配置為既加載和/或?qū)嵗毞址盒皖惖耐耆盒桶姹?又加載和/或?qū)嵗毞址盒皖惖牟煌耆盒桶姹尽?/p>

      圖5是表示在一個實施例中的基于細分泛型類的類的實例化的邏輯方框圖。根據(jù)一些實施例,當(dāng)細分(例如,多層)泛型類(諸如,細分類)500被加載時,運行時環(huán)境(例如,基于Java的系統(tǒng)中的VM)可分析所述類以確定哪些方法(或其它成員)被限制于特定參數(shù)化,并且可忽略不適用于所述特定實例化的那些方法。如上所述,細分類文件可包括指示器(例如,屬性、裝飾、元數(shù)據(jù)等),所述指示器可識別被限制于特定參數(shù)化(或完全泛型)的特定類成員,并且類加載器可使用這些指示器確定使用哪些類成員以及(可)忽略哪些類成員。

      因此,在一個實施例中,當(dāng)如箭頭530所指示,細分類500被加載和/或?qū)嵗癁轭惖耐耆盒桶姹?例如,針對非引用類型實例化)時,類加載器可產(chǎn)生類的完全泛型版本,所述類的完全泛型版本包括來自泛型層510的那些類成員并且可不包括來自對象層520的那些類成員(例如,被指示為不支持特定的擴展的泛型),如完全泛型類聲明550中所示。

      另外,根據(jù)一個實施例,當(dāng)如箭頭540所指示,細分類500被加載和/或?qū)嵗癁椴恢С謹U展的泛型域的類的版本(例如,針對引用類型實例化)時,類加載器可產(chǎn)生類的引用特定版本,如引用特定類聲明560所示,所述類的引用特定版本包括來自對象層520的那些類成員,而不包括來自泛型層的類成員,如引用特定類聲明560中所示。需要注意的是,盡管圖5表示使用與僅引用泛型域?qū)?yīng)的先前泛型域的實施例并且根據(jù)使用與僅引用泛型域?qū)?yīng)的先前泛型域的實施例描述圖5,但在其它實施例中,不同類型(和或一組類型)可被包括在各種泛型域中的任何泛型域中(并且因此,被包括在細分泛型類的不同層中)。

      圖6是表示根據(jù)一個實施例的用于加載(和/或?qū)嵗?細分泛型類的完全泛型版本的方法的一個實施例的流程圖。如塊600中所示,根據(jù)一些實施例,類加載器(或運行時環(huán)境的其它部件)可加載細分類的完全泛型版本,所述細分類的完全泛型版本包括包含一個或多個類成員的抽象版本的泛型層和包括在泛型層中抽象的至少一個類成員的非抽象版本的引用特定層。

      例如,如以上關(guān)于圖5所述,類加載器可基于細分類500加載類。細分類500可包括泛型層510和對象或引用特定層520。在一些實施例中,用于加載類的完全泛型版本(例如,用于非引用類型的類的版本)的方法可涉及:在細分類的完全泛型版本中包括在泛型層中抽象的所述一個或多個類成員,如塊610中所示。例如,細分類500的完全泛型版本可包括來自泛型層510的類成員remove(T)和removeAt(int),如完全泛型類聲明550中所示。

      用于加載類的完全泛型版本(例如,用于非引用類型的類的版本)的方法也可涉及:不在細分類的完全泛型版本中包括不支持擴展的泛型的至少一部分的一個或多個類成員,如塊620中所示。例如,完全泛型類聲明550可能不包括來自對象層520的類成員,如上所述,所述來自對象層520的類成員可能不在非引用類型上支持泛型。在一些實施例中,對象層中所包括的類成員(例如,僅在引用類型上是泛型的那些類成員)可被視為抽象和不抽象。因此,根據(jù)一些實施例,一些方法(例如,以上的ListLike示例中的remove)在T是引用的情況下可實現(xiàn),但在T是值的情況下可能無法實現(xiàn)。需要注意的是,盡管圖6表示使用與僅引用泛型域?qū)?yīng)的先前泛型域的實施例并且根據(jù)使用與僅引用泛型域?qū)?yīng)的先前泛型域的實施例描述圖6,但在其它實施例中,不同類型(和或一組類型)可被包括在各種泛型域中的任何泛型域中(并且因此,被包括在細分泛型類的不同層中)。

      圖7是根據(jù)一個實施例的用于加載(和/或?qū)嵗?與先前泛型域?qū)?yīng)并且不支持擴展的泛型域的細分泛型類的版本的方法的一個實施例的流程圖。如塊700中所示,在一個示例性實施例中,類加載器(或運行時環(huán)境的其它部件)可加載細分類的引用特定版本。如上所述,類的已有實現(xiàn)方式(例如,不支持擴展的泛型域)可預(yù)期存在某些方法,并且可預(yù)期它們是抽象的,同時預(yù)期不會看見新的抽象方法(例如,所述新的抽象方法的存在可引起編譯器錯誤)。因此,根據(jù)一些實施例,與以上關(guān)于圖6描述的加載類的完全泛型版本一樣,所述細分類可包括包含一個或多個類成員的抽象版本的泛型層和包括在泛型層中抽象的至少一個類成員的非抽象版本的引用特定層。

      根據(jù)一些實施例,如塊710中所示,用于加載細分類的引用特定版本的方法可涉及:不在細分類的引用特定版本中包括在泛型層中抽象的所述一個或多個類成員。例如,如引用特定類聲明560中所示,類的引用特定版本可不包括來自泛型層510的抽象成員(例如,引用特定類聲明560不包括來自泛型層的抽象方法remove(T))。用于加載細分類的引用特定版本的方法也可涉及:在細分類的引用特定版本中包括不支持擴展的泛型的至少一部分的類成員,如塊720中所示。例如,如引用特定類聲明560中所示,類的引用特定版本可包括來自對象層520的那些類成員,所述來自對象層520的那些類成員(引用特定)不支持擴展的泛型(例如,它們不在非引用類型上支持泛型)。

      需要注意的是,盡管圖7表示使用與僅引用泛型域?qū)?yīng)的先前泛型域的實施例并且根據(jù)使用與僅引用泛型域?qū)?yīng)的先前泛型域的實施例描述圖7,但在其它實施例中,不同類型(和或一組類型)可被包括在各種泛型域中的任何泛型域中(并且因此,被包括在細分泛型類的不同層中)。

      當(dāng)對類進行特化時,也可使用細分類的多個層。例如,當(dāng)細分類被特化時,特化器可使用類文件作為輸入以產(chǎn)生新的類文件,將輸入類文件的每個方法(或其它類成員)變換成所述新的類文件的對應(yīng)方法(或其它成員)。然而,在一些實施例中,特化器可(在所述新的類文件中)不包括不適用于正在執(zhí)行的特定特化的某些方法/成員。與類加載器一樣,特化器可使用各種類型的指示器中的任何類型的指示器確定對哪些類成員進行特化以及在所述新的類文件中不包括哪些類成員。

      圖8是表示根據(jù)一個實施例的用于將用于非引用類型參數(shù)化的細分泛型類特化的方法的一個實施例的流程圖。如塊800中所示,用于對用于非引用類型參數(shù)化的細分泛型類進行特化的方法可包括:創(chuàng)建包括在泛型層中抽象的一個或多個類成員的細分類的特化版本,如塊810中所示,而不包括不支持擴展的泛型的至少一部分的一個或多個類成員,如塊820中所示。

      例如,用于非引用類型(例如,int)的細分類500的特化可涉及創(chuàng)建包括來自泛型層510的抽象成員(諸如,remove(T))的類的特化版本,但可不包括來自對象層520的引用特定成員,所述來自對象層520的引用特定成員可不在非引用類型上支持特化。

      另外,在一些實施例中,某些類可具有這樣的方法:所述方法的簽名“錯誤地”包括關(guān)于先前泛型域的假設(shè)。例如,盡管從一批對象去除等于給定對象的對象的方法的自然聲明可能是remove(T),但開發(fā)者經(jīng)常將這種方法聲明編碼為remove(object),當(dāng)隱式泛型域?qū)?yīng)于T extends Object(例如,僅引用泛型域)時,這是無害的,但當(dāng)泛型域被擴展時,這可變得存在問題。例如,Collection類可具有remove(T)方法,所述remove(T)方法可被聲明為remove(Object),但當(dāng)類被特化時,這些方法可能也需要被特化(例如,Collection.remove的實參類型是Object,而不是T)。因此,在一些實施例中,根據(jù)一些實施例,注釋(或其它指示器)可被用于指示該方法應(yīng)該被特化,就好像這個類型參數(shù)被聲明為T。不同形式的注釋可被用在不同實施例中。例如,在一些實施例中,可使用@SpecializeAsFullyGeneric形式的注釋。

      另外,將泛型類分解成多個層也可被應(yīng)用以便可消除針對某些類型的可null的結(jié)果的問題。例如,null可被視為每個引用類型的有效值,并且可因此被用于代表這樣的事實:沒有什么東西位于正在引用的位置,或者所述引用不表示任何位置。然而,原始類型和值類型可能不具有null的類似物。這可被視為對某些方法(諸如,被定義為返回null的方法)的挑戰(zhàn)。例如,在一個實施例中,方法Map.get可被定義為在不能在map中找到指定鍵的情況下返回null。

      根據(jù)一些實施例,利用null的某些操作(例如,分派null和與null比較)可被分派特定語義。例如,在一些實施例中,分派null可被視為分派零值。零可被視為未初始化的字段和陣列元素被設(shè)置的值(例如,數(shù)字類型的零、boolean的false等)。類似地,在一些實施例中,與null的比較可被視為與零值的比較。然而,在其它實施例中,這種處理可能引入模糊性,其中可能無法區(qū)分沒有值(例如,引用null)和等于零的值(例如,未初始化的數(shù)字或布爾類型)。類似地,使用Map.get的傳統(tǒng)行為,返回值null能夠意味著“沒有映射”或者能夠意味著“映射到null”。替代地,在一些實施例中,null的某些使用可被禁止,這可不利地影響一些類(諸如,Java中的HashMap類)的某些使用(例如,可特化性)。

      在一些實施例中,將泛型類分解多個層可被用于潛在地消除原始類型(或不支持擴展的泛型域的其它類型)的可null結(jié)果的問題。例如,Map.get可被移動到引用特定層中(例如,用于特化),并且原始實例化可使用getOrDefault方法(例如,在完全泛型層中)。例如:

      類似于以上的ListLike示例,示例性類Map<K,V>可包括多個層,諸如完全泛型層和與先前泛型域?qū)?yīng)的層。完全泛型層可包括抽象方法getOrDefault(K key,V defaultValue)。在一些實施例中,對于這個抽象方法,針對值類型的新特化的類可能沒有問題。與先前泛型域?qū)?yīng)的層可包括(或添加)抽象方法(諸如,示例性getK key))以及來自泛型層的方法的具體實現(xiàn)方式(諸如,getOrDefault(K key,V defaultValue))方法。

      當(dāng)針對非引用類型對以上示例性Map類進行特化時,通過如上所述包括來自泛型層的抽象方法而不包括來自對象層的方法,特化器可產(chǎn)生Map類。替代地,根據(jù)一些實施例,當(dāng)針對非引用類型對以上示例性Map類進行特化時,通過包括來自對象層的方法而不包括(例如,忽略)來自泛型層的抽象方法,特化器可產(chǎn)生Map類。

      因此,在一些實施例中,Map<K,V>(其中T擴展了Object)的已有客戶機可看見remove(Object)和remove(int)方法(例如,當(dāng)Map針對引用類型而被特化時),由此可保持二進制兼容性,同時針對非引用類型(諸如,int)的ListLike<T>的特化可看見一對無問題的方法remove(T)和removeAt(int)。

      在至少一些實施例中,實現(xiàn)這里描述的一種或多種技術(shù)的一部分或全部的計算機系統(tǒng)可包括通用計算機系統(tǒng),所述通用計算機系統(tǒng)包括一個或多個計算機可讀介質(zhì)或被配置為訪問一個或多個計算機可讀介質(zhì)。圖9表示適合實現(xiàn)這里描述的方法、特征和增強的這種通用計算裝置3000。在示出的實施例中,計算裝置3000包括經(jīng)輸入/輸出(I/O)接口3030耦合到系統(tǒng)存儲器3020的一個或多個處理器3010。計算裝置3000還包括耦合到I/O接口3030的網(wǎng)絡(luò)接口3040。

      在各種實施例中,計算裝置3000可以是包括一個處理器3010的單處理器系統(tǒng)或包括幾個處理器3010(例如,兩個、四個、八個或另一合適的數(shù)量)的多處理器系統(tǒng)。處理器3010可包括能夠執(zhí)行指令的任何合適的處理器。例如,在各種實施例中,處理器3010可以是執(zhí)行各種指令集架構(gòu)(ISA)中的任何指令集架構(gòu)(ISA)(諸如,x86、PowerPC、SPARC或MIPS ISA或任何其它合適的ISA)的通用或嵌入式處理器。在多處理器系統(tǒng)中,每個處理器3010可通常但并不必然執(zhí)行相同的ISA。

      系統(tǒng)存儲器3020可被配置為存儲可由處理器3010訪問的程序指令和數(shù)據(jù)。在各種實施例中,可使用任何合適的存儲技術(shù)(諸如,靜態(tài)隨機存取存儲器(SRAM)、同步動態(tài)RAM(SDRAM)、非易失性/閃存類型存儲器或任何其它類型的存儲器)實現(xiàn)系統(tǒng)存儲器3020。在示出的實施例中,實現(xiàn)一個或多個預(yù)期功能的程序指令和數(shù)據(jù)(諸如,上述那些方法、技術(shù)和數(shù)據(jù))被示出為在系統(tǒng)存儲器3020內(nèi)存儲為代碼(即,程序指令)3025和數(shù)據(jù)3026。例如,在一個實施例中,存儲器3020以及代碼3025和數(shù)據(jù)3026可存儲用于實現(xiàn)上述編譯器120和/或虛擬化運行時環(huán)境140的程序指令和數(shù)據(jù)。

      在各種實施例中,編譯器120和/或虛擬化運行時環(huán)境140(和/或其任何個體子模塊)可分別被按照各種編程語言或方法中的任何編程語言或方法實現(xiàn)。例如,在一個實施例中,可按照C、C++、匯編、JAVA或其它通用編程語言中的任何編程語言編寫編譯器120和/或虛擬化運行時環(huán)境140,而在另一實施例中,可使用不同的更加專業(yè)的編程語言編寫編譯器120和/或虛擬化運行時環(huán)境140中的一個或多個。此外,在一些實施例中,可不使用相同的編程語言實現(xiàn)編譯器120和/或虛擬化運行時環(huán)境140(和/或其各種子模塊)。

      在一個實施例中,I/O接口3030可被配置為協(xié)調(diào)處理器3010、系統(tǒng)存儲器3020和所述裝置中的任何外圍裝置(包括網(wǎng)絡(luò)接口3040或其它外圍接口)之間的I/O業(yè)務(wù)。在一些實施例中,I/O接口3030可執(zhí)行任何必要的協(xié)議、定時或其它數(shù)據(jù)變換以將來自一個部件(例如,系統(tǒng)存儲器3020)的數(shù)據(jù)信號轉(zhuǎn)換成適合由另一部件(例如,處理器3010)使用的格式。在一些實施例中,I/O接口3030可包括對通過各種類型的外圍總線(諸如,例如外圍部件互連(PCI)總線標準或通用串行總線(USB)標準的變型)連接的裝置的支持。此外,在一些實施例中,I/O接口3030的一些或全部功能(諸如,與系統(tǒng)存儲器3020的接口)可被直接包括在處理器3010中。

      網(wǎng)絡(luò)接口3040可被配置為允許在計算裝置3000和連接到一個或多個網(wǎng)絡(luò)3050的其它裝置3060之間交換數(shù)據(jù)。在各種實施例中,網(wǎng)絡(luò)接口3040可支持經(jīng)任何合適的有線或無線通用數(shù)據(jù)網(wǎng)絡(luò)(諸如,例如以太網(wǎng)網(wǎng)絡(luò)的類型)的通信。

      在一些實施例中,系統(tǒng)存儲器3020可以是計算機可讀(例如,計算機可訪問)介質(zhì)的一個實施例,所述計算機可讀介質(zhì)被配置為存儲用于實現(xiàn)對應(yīng)方法和設(shè)備的實施例的如以上參照圖1-8所述的程序指令和數(shù)據(jù)。然而,在其它實施例中,可在不同類型的計算機可讀介質(zhì)上接收、發(fā)送或存儲程序指令和/或數(shù)據(jù)。一般而言,計算機可讀介質(zhì)可包括經(jīng)I/O接口3030耦合到計算裝置3000的非暫態(tài)存儲介質(zhì)或存儲器介質(zhì),諸如磁介質(zhì)或光學(xué)介質(zhì)(例如,盤或DVD/CD)。非暫態(tài)計算機可讀存儲介質(zhì)還可包括任何易失性或非易失性介質(zhì),諸如RAM(例如,SDRAM、DDR SDRAM、RDRAM、SRAM等)、ROM等,所述任何易失性或非易失性介質(zhì)可被包括在計算裝置3000的一些實施例中作為系統(tǒng)存儲器3020或另一類型的存儲器。

      另外,計算機可讀介質(zhì)可包括經(jīng)通信介質(zhì)(諸如,網(wǎng)絡(luò)和/或無線鏈路)傳送的傳輸介質(zhì)或信號(諸如,電信號、電磁信號或數(shù)字信號),諸如可經(jīng)網(wǎng)絡(luò)接口3040實現(xiàn)。在各種實施例中,多個計算裝置(諸如,圖9中示出的計算裝置)中的一部分或全部可被用于實現(xiàn)描述的功能;例如,在各種不同裝置和服務(wù)器上運行的軟件部件可合作以提供所述功能。在一些實施例中,除了使用通用計算機系統(tǒng)實現(xiàn)描述的功能的一部分之外或替代于使用通用計算機系統(tǒng)實現(xiàn)描述的功能的一部分,可使用存儲裝置、網(wǎng)絡(luò)裝置或?qū)S糜嬎銠C系統(tǒng)實現(xiàn)描述的功能的一部分。如這里所使用,術(shù)語“計算裝置”表示至少所有這些類型的裝置,但不限于這些類型的裝置。

      各種實施例還可包括接收、發(fā)送或存儲根據(jù)前面的描述在計算機可讀介質(zhì)上實現(xiàn)的指令和/或數(shù)據(jù)。一般而言,計算機可讀介質(zhì)可包括存儲介質(zhì)或存儲器介質(zhì),諸如磁介質(zhì)或光學(xué)介質(zhì)(例如,盤或DVD/CD-ROM)、易失性介質(zhì)或非易失性介質(zhì)(諸如,RAM(例如,SDRAM、DDR、RDRAM、SRAM等)、ROM等)。在一些實施例中,計算機可讀介質(zhì)還可包括經(jīng)通信介質(zhì)(諸如,網(wǎng)絡(luò)和/或無線鏈路)傳送的傳輸介質(zhì)或信號(諸如,電信號、電磁信號或數(shù)字信號)。

      如附圖中所示并且如這里所述的各種方法代表方法的示例性實施例。所述方法可被實現(xiàn)于軟件、硬件或者其組合。在各種方法中,步驟的次序可被改變,并且各種元件可被添加、重新排序、組合、省略、修改等。各種步驟可被自動地(例如,不通過用戶輸入來直接提示)和/或以編程方式(例如,根據(jù)程序指令)執(zhí)行。

      盡管已在這里參照特定實施例并且在特定實施例的情況下描述各種系統(tǒng)和方法,但將會理解,這些實施例是說明性的并且本公開的范圍不限于這些特定實施例??蓪崿F(xiàn)許多變化、修改、添加和改進。例如,在描述中識別的塊和邏輯單元用于理解描述的實施例,而非意圖限制本公開。例如,在一些實施例中,這里描述為由編譯器120執(zhí)行的動作、處理、方法、任務(wù)或功能可由虛擬化運行時環(huán)境140執(zhí)行,反之亦然。另外,在這里描述或利用不同術(shù)語描述的系統(tǒng)和方法的各種實現(xiàn)中,可按照不同方式在塊中分離或組合功能。

      這些實施例應(yīng)該是說明性的,而非限制性的。因此,可為這里描述的部件提供多個實例作為單個實例。各種部件、操作和數(shù)據(jù)倉庫之間的邊界是稍微任意的,并且在特定說明性結(jié)構(gòu)的情況下示出特定操作。可設(shè)想功能的其它分配,并且所述功能的其它分配可落在下面的示例的范圍內(nèi)。最后,在示例性結(jié)構(gòu)中作為分立部件提供的結(jié)構(gòu)和功能可被實現(xiàn)為組合結(jié)構(gòu)或部件。

      雖然已詳細地描述以上實施例,但一旦充分理解以上公開,許多變化和修改將會變得清楚。下面的權(quán)利要求應(yīng)該被解釋為包括所有這種變化和修改。

      當(dāng)前第1頁1 2 3 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1