亚洲毛片视频_国产精品日韩高清_国产伦理一区_国产精品视频免费一区_亚洲精品1区2区_美女尤物久久精品_亚洲人体大胆视频_亚洲欧美日韩精品久久久_国产一区成人_国产精品综合

北京北大青鳥學(xué)校學(xué)術(shù)部講解:Java類庫(kù)中的泛型(一)

北京北大青鳥學(xué)校學(xué)術(shù)部講師將繼續(xù)講解關(guān)于Java泛型的技術(shù)知識(shí),關(guān)于Java泛型的定義、相關(guān)例子等請(qǐng)參考之前的幾篇文章,在這里就不做陳述了。今天這篇文章,將主講介紹一下Java類庫(kù)中的泛型(北大青鳥課程

集合類
北京北大青鳥學(xué)校專家介紹:到目前為止,Java 類庫(kù)中泛型支持存在最多的地方就是集合框架。就像容器類是 C++ 語(yǔ)言中模板的主要?jiǎng)訖C(jī)一樣(參閱 附錄 A:與 C++ 模板的比較)(盡管它們隨后用于很多別的用途),改善集合類的類型安全是 Java 語(yǔ)言中泛型的主要?jiǎng)訖C(jī)。集合類也充當(dāng)如何使用泛型的模型,因?yàn)樗鼈冄菔玖朔盒偷膸缀跛械臉?biāo)準(zhǔn)技巧和方言。(北大青鳥課程

所有的標(biāo)準(zhǔn)集合接口都是泛型化的 —— Collection、List、Set 和 Map。類似地,集合接口的實(shí)現(xiàn)都是用相同類型參數(shù)泛型化的,所以 HashMap 實(shí)現(xiàn) Map 等。

集合類也使用泛型的許多“技巧”和方言,比如上限通配符和下限通配符。例如,在接口 Collection 中,addAll 方法是像下面這樣定義的:
interface Collection {
boolean addAll(Collection);
}

該定義組合了通配符類型參數(shù)和有限制類型參數(shù),允許您將 Collection 的內(nèi)容添加到 Collection。(北大青鳥課程

北京北大青鳥學(xué)校專家提醒:如果類庫(kù)將 addAll() 定義為接受 Collection,您就不能將 Collection 的內(nèi)容添加到 Collection。不是限制 addAll() 的參數(shù)是一個(gè)與您將要添加到的集合包含相同類型的集合,而有可能建立一個(gè)更合理的約束,即傳遞給 addAll() 的集合的元素 適合于添加到您的集合。有限制類型允許您這樣做,并且使用有限制通配符使您不需要使用另一個(gè)不會(huì)用在其他任何地方的占位符名稱。

應(yīng)該可以將 addAll() 的類型參數(shù)定義為 Collection。但是,北京北大青鳥學(xué)校專家認(rèn)為,這不但沒(méi)什么用,而且還會(huì)改變 Collection 接口的語(yǔ)義,因?yàn)榉盒桶姹镜恼Z(yǔ)義將會(huì)不同于非泛型版本的語(yǔ)義。這闡述了泛型化一個(gè)現(xiàn)有的類要比定義一個(gè)新的泛型類難得多,因?yàn)槟仨氉⒁獠灰念惖恼Z(yǔ)義或者破壞現(xiàn)有的非泛型代碼。

作為泛型化一個(gè)類(如果不小心的話)如何會(huì)更改其語(yǔ)義的一個(gè)更加微妙的例子,注意 Collection.removeAll() 的參數(shù)的類型是 Collection,而不是 Collection。這是因?yàn)閭鬟f混合類型的集合給 removeAll() 是可接受的,并且更加限制地定義 removeAll 將會(huì)更改方法的語(yǔ)義和有用性。(北大青鳥課程
 
其他容器類
北京北大青鳥學(xué)校專家介紹:除了集合類之外,Java 類庫(kù)中還有幾個(gè)其他的類也充當(dāng)值的容器。這些類包括 WeakReference、SoftReference 和 ThreadLocal。它們都已經(jīng)在其包含的值的類型上泛型化了,所以 WeakReference 是對(duì) T 類型的對(duì)象的弱引用,ThreadLocal 則是到 T 類型的線程局部變量的句柄。

泛型不止用于容器
泛型最常見最直觀的使用是容器類,比如集合類或引用類(比如 WeakReference)。Collection 中類型參數(shù)的含義很明顯 —— “一個(gè)所有值都是 V 類型的集合”。類似地,ThreadLocal 也有一個(gè)明顯的解釋 —— “一個(gè)其類型是 T 的線程局部變量”。但是,泛型規(guī)格說(shuō)明中沒(méi)有指定容積。(北大青鳥課程

像 Comparable 或 Class 這樣的類中類型參數(shù)的含義更加微妙。有時(shí),就像 Class 中一樣,類型變量主要是幫助編譯器進(jìn)行類型推理。有時(shí),就像隱含的 Enum> 中一樣,類型變量只是在類層次結(jié)構(gòu)上加一個(gè)約束。

Comparable
Comparable 接口已經(jīng)泛型化了,所以實(shí)現(xiàn) Comparable 的對(duì)象聲明它可以與什么類型進(jìn)行比較。北京北大青鳥學(xué)校專家總結(jié):(通常,這是對(duì)象本身的類型,但是有時(shí)也可能是父類。)
public interface Comparable {
public boolean compareTo(T other);
}

所以 Comparable 接口包含一個(gè)類型參數(shù) T,該參數(shù)是一個(gè)實(shí)現(xiàn) Comparable 的類可以與之比較的對(duì)象的類型。這意味著如果定義一個(gè)實(shí)現(xiàn) Comparable 的類,比如 String,就必須不僅聲明類支持比較,還要聲明它可與什么比較(通常是與它本身比較):
public class String implements Comparable { ... }

現(xiàn)在來(lái)考慮一個(gè)二元 max() 方法的實(shí)現(xiàn)。您想要接受兩個(gè)相同類型的參數(shù),二者都是 Comparable,并且相互之間是 Comparable。幸運(yùn)的是,如果使用泛型方法和有限制類型參數(shù)的話,這相當(dāng)直觀:
public static > T max(T t1, T t2) {
if (t1.compareTo(t2) > 0)
    return t1;
else
    return t2;
}

北京北大青鳥學(xué)校專家介紹:在本例中,您定義了一個(gè)泛型方法,在類型 T 上泛型化,您約束該類型擴(kuò)展(實(shí)現(xiàn)) Comparable。兩個(gè)參數(shù)都必須是 T 類型,這表示它們是相同類型,支持比較,并且相互可比較。容易!

更好的是,編譯器將使用類型推理來(lái)確定當(dāng)調(diào)用 max() 時(shí) T 的值表示什么意思。所以根本不用指定 T,下面的調(diào)用就能工作:
String s = max("moo", "bark");

編譯器將計(jì)算出 T 的預(yù)定值是 String,因此它將進(jìn)行編譯和類型檢查。但是如果您試圖用不實(shí)現(xiàn) Comparable 的 類 X 的參數(shù)調(diào)用 max(),那么編譯器將不允許這樣做。
 
Class
類 Class 已經(jīng)泛型化了,但是很多人一開始都感覺(jué)其泛型化的方式很混亂。Class 中類型參數(shù) T 的含義是什么?事實(shí)證明它是所引用的類接口。怎么會(huì)是這樣的呢?那是一個(gè)循環(huán)推理?如果不是的話,為什么這樣定義它?

在以前的 JDK 中,Class.newInstance() 方法的定義返回 Object,您很可能要將該返回類型強(qiáng)制轉(zhuǎn)換為另一種類型:
class Class {
Object newInstance();
}
但是使用泛型,您定義 Class.newInstance() 方法具有一個(gè)更加特定的返回類型:
class Class {
T newInstance();
}(北大青鳥課程

如何創(chuàng)建一個(gè) Class 類型的實(shí)例?北京北大青鳥學(xué)校專家介紹,就像使用非泛型代碼一樣,有兩種方式:調(diào)用方法 Class.forName() 或者使用類常量 X.class。Class.forName() 被定義為返回 Class。另一方面,類常量 X.class 被定義為具有類型 Class,所以 String.class 是 Class 類型的。

讓 Foo.class 是 Class 類型的有什么好處?北京北大青鳥學(xué)校專家解答:最大的好處是,通過(guò)類型推理的魔力,可以提高使用反射的代碼的類型安全。另外,還不需要將 Foo.class.newInstance() 強(qiáng)制類型轉(zhuǎn)換為 Foo。

考慮一個(gè)方法,它從數(shù)據(jù)庫(kù)檢索一組對(duì)象,并返回 JavaBeans 對(duì)象的一個(gè)集合。您通過(guò)反射來(lái)實(shí)例化和初始化創(chuàng)建的對(duì)象,但是這并不意味著類型安全必須完全被拋至腦后。考慮下面這個(gè)方法:
public static List getRecords(Class c, Selector s) {
// Use Selector to select rows
List list = new ArrayList();
for (/* iterate over results */) {
    T row = c.newInstance();
    // use reflection to set fields from result
    list.add(row);
}
return list;
}
北大青鳥課程
可以像下面這樣簡(jiǎn)單地調(diào)用該方法:
List l = getRecords(FooRecord.class, fooSelector);
編譯器將會(huì)根據(jù) FooRecord.class 是 Class 類型的這一事實(shí),推斷 getRecords() 的返回類型。您使用類常量來(lái)構(gòu)造新的實(shí)例并提供編譯器在類型檢查中要用到的類型信息。
 
用 Class 替換 T[]
Collection 接口包含一個(gè)方法,用于將集合的內(nèi)容復(fù)制到一個(gè)調(diào)用者指定類型的數(shù)組中:
public Object[] toArray(Object[] prototypeArray) { ... }

toArray(Object[]) 的語(yǔ)義是,如果傳遞的數(shù)組足夠大,就會(huì)使用它來(lái)保存結(jié)果,否則,就會(huì)使用反射分配一個(gè)相同類型的新數(shù)組。一般來(lái)說(shuō),單獨(dú)傳遞一個(gè)數(shù)組作為參數(shù)來(lái)提供想要的返回類型是一個(gè)小技巧,但是在引入泛型之前,這是與方法交流類型信息最方便的方式。

有了泛型,就可以用一種更加直觀的方式來(lái)做這件事。不像上面這樣定義 toArray(),泛型 toArray() 可能看起來(lái)像下面這樣:
public T[] toArray(Class returnType)
調(diào)用這樣一個(gè) toArray() 方法很簡(jiǎn)單:
FooBar[] fba = something.toArray(FooBar.class);

Collection 接口還沒(méi)有改變?yōu)槭褂迷摷夹g(shù),因?yàn)檫@會(huì)破壞許多現(xiàn)有的集合實(shí)現(xiàn)。但是如果使用泛型從新構(gòu)建 Collection,則當(dāng)然會(huì)使用該方言來(lái)指定它想要返回值是哪種類型。
 
Enum
JDK 5.0 中 Java 語(yǔ)言另一個(gè)增加的特性是枚舉。當(dāng)您使用 enum 關(guān)鍵字聲明一個(gè)枚舉時(shí),編譯器就會(huì)在內(nèi)部為您生成一個(gè)類,用于擴(kuò)展 Enum 并為枚舉的每個(gè)值聲明靜態(tài)實(shí)例。所以如果您說(shuō):
public enum Suit {HEART, DIAMOND, CLUB, SPADE};

編譯器就會(huì)在內(nèi)部生成一個(gè)叫做 Suit 的類,該類擴(kuò)展 java.lang.Enum 并具有叫做 HEART、DIAMOND、CLUB 和 SPADE 的常量(public static final)成員,每個(gè)成員都是 Suit 類。(北大青鳥課程)

與 Class 一樣,Enum 也是一個(gè)泛型類。但是與 Class 不同,它的簽名稍微更復(fù)雜一些:
class Enum> { . . . }
這究竟是什么意思?這難道不會(huì)導(dǎo)致無(wú)限遞歸?

我們逐步來(lái)分析。類型參數(shù) E 用于 Enum 的各種方法中,比如 compareTo() 或 getDeclaringClass()。為了這些方法的類型安全,Enum 類必須在枚舉的類上泛型化。

所以 extends Enum 部分如何理解?

北京北大青鳥學(xué)校專家介紹,該部分又具有兩個(gè)部分。第一部分指出,作為 Enum 的類型參數(shù)的類本身必須是 Enum 的子類型,所以您不能聲明一個(gè)類 X 擴(kuò)展 Enum。第二部分指出,任何擴(kuò)展 Enum 的類必須傳遞它本身 作為類型參數(shù)。您不能聲明 X 擴(kuò)展 Enum,即使 Y 擴(kuò)展 Enum。

總之,Enum 是一個(gè)參數(shù)化的類型,只可以為它的子類型實(shí)例化,并且這些子類型然后將根據(jù)子類型來(lái)繼承方法。幸運(yùn)的是,在 Enum 情況下,編譯器為您做這些工作,一切都很好。(北京北大青鳥學(xué)校,未完待續(xù))
 

北大青鳥網(wǎng)上報(bào)名
北大青鳥招生簡(jiǎn)章
亚洲毛片视频_国产精品日韩高清_国产伦理一区_国产精品视频免费一区_亚洲精品1区2区_美女尤物久久精品_亚洲人体大胆视频_亚洲欧美日韩精品久久久_国产一区成人_国产精品综合
欧美中文字幕一二三区视频| 日韩码欧中文字| 91福利在线看| 亚洲一区二区三区高清不卡| 亚洲精品视频一区二区三区| 国产精品hd| 色综合久久综合网欧美综合网| av电影天堂一区二区在线| 成人18视频日本| 91在线码无精品| 欧美精品一区二区三区在线看午夜| 97久久精品人人爽人人爽蜜臀 | 欧美成人一品| 欧美亚韩一区| 亚洲在线不卡| 欧美中文字幕一区| 欧美一区二区三区在线| 欧美sm美女调教| 久久精品亚洲精品国产欧美kt∨| 久久午夜免费电影| 中文字幕中文字幕一区二区| 伊人色综合久久天天人手人婷| 一区二区三区加勒比av| 亚洲香蕉伊在人在线观| 婷婷久久综合九色综合绿巨人| 日韩精品电影在线| 国产成人av一区二区三区在线| 国产成人在线观看| 欧美福利精品| 国产精品久久国产愉拍| 狼狼综合久久久久综合网| 9191成人精品久久| 国产精品丝袜久久久久久app| 亚洲一区在线观看视频| 裸体在线国模精品偷拍| 成人激情免费电影网址| 国产一区二区无遮挡| 先锋亚洲精品| 日韩视频在线一区二区| 国产精品国产三级国产有无不卡 | 欧美日韩亚洲一区三区 | 亚洲综合视频一区| 91精品一区二区三区在线观看| 久久伊人蜜桃av一区二区| 亚洲欧美日韩国产成人精品影院| 日韩1区2区日韩1区2区| 99精品视频在线观看免费| 亚洲一区不卡| 久久久亚洲高清| 视频一区欧美精品| 色综合天天狠狠| 一本到一区二区三区| 久久久精品黄色| 日韩av中文字幕一区二区| av综合在线播放| 色狠狠av一区二区三区| 欧美激情在线一区二区| 韩日精品视频一区| 国产欧美日韩一区二区三区在线| 欧美一区二区三区免费视频| 亚洲午夜精品网| 91女人视频在线观看| 欧亚一区二区三区| 亚洲激情自拍视频| 91视频在线看| 欧美男男青年gay1069videost| 中文字幕一区二区三区视频| 国产很黄免费观看久久| 国产精品一区二区在线观看| 国产日韩成人精品| 国产高清在线观看免费不卡| 亚洲一区观看| 国产精品伦理一区二区| 成人一级视频在线观看| 欧美日韩一区中文字幕| 亚洲电影激情视频网站| 欧美一区在线看| 日韩欧美色电影| 久久精品72免费观看| 国产美女在线精品免费观看| 日本一区二区三区国色天香 | 欧美伊人久久久久久久久影院 | 美女视频黄a大片欧美| 亚洲开发第一视频在线播放| 久久美女艺术照精彩视频福利播放| 美腿丝袜一区二区三区| 男女精品网站| 一区二区三区国产| 亚洲午夜精品福利| 国产日韩欧美激情| 99久久er热在这里只有精品66| 欧美色欧美亚洲另类二区| 亚洲成人综合视频| 国产亚洲欧洲| 亚洲一卡二卡三卡四卡五卡| 136国产福利精品导航网址| 国产精品午夜免费| 欧美日韩国语| 国产精品灌醉下药二区| 欧美日韩一区在线播放| 中文字幕精品三区| 欧美午夜精品| 欧美国产丝袜视频| 狠狠色伊人亚洲综合网站色| 国产日韩欧美a| 国产精品黄色| 亚洲精品网站在线观看| 午夜综合激情| 免费精品视频在线| 欧美性感一区二区三区| 久久国产精品色| 欧美一区二区网站| 成人自拍视频在线| 久久久国产午夜精品| 午夜精品剧场| 一区二区三区久久久| 麻豆av一区二区三区| 免费一级欧美片在线观看| 欧美精品1区2区3区| 成人国产亚洲欧美成人综合网| 精品av综合导航| 亚洲大胆女人| 五月天中文字幕一区二区| 欧美精品一二三| 91麻豆高清视频| 亚洲欧美日韩系列| 欧美视频在线观看一区| av中文字幕在线不卡| 日韩毛片在线免费观看| 色系网站成人免费| 成人免费观看av| 成人欧美一区二区三区1314 | 亚洲人成影院在线观看| 欧洲av一区二区嗯嗯嗯啊| 波多野结衣中文字幕一区| 国产精品久久久久四虎| 色哟哟国产精品| 91啪在线观看| 日韩精品电影在线| 久久久久国色av免费看影院| 在线视频日韩| 紧缚捆绑精品一区二区| 欧美激情一区二区三区四区| 亚洲免费综合| 成人av在线看| 午夜久久久影院| 欧美精品一区二区精品网| 亚洲欧洲精品一区二区| 国产一区在线观看视频| 中文字幕五月欧美| 欧美日韩国产在线观看| 韩国一区二区三区美女美女秀| 婷婷国产在线综合| 久久视频一区二区| 久久在线91| 欧美激情性爽国产精品17p| 丝袜美腿成人在线| 国产视频一区不卡| 精品视频在线免费| 亚洲精品九九| 成人av电影在线网| 无码av免费一区二区三区试看| 欧美成人精精品一区二区频| 久久精品观看| 狠狠噜噜久久| 盗摄精品av一区二区三区| 亚洲一区二区av电影| 久久久精品国产免费观看同学| 欧美中文字幕一二三区视频| 伊人精品在线| 北条麻妃国产九九精品视频| 欧美96一区二区免费视频| 国产精品乱人伦一区二区| 欧美xxxxx裸体时装秀| 在线观看视频91| 国产亚洲永久域名| 午夜精品视频在线观看一区二区| 国产九九视频一区二区三区| 香蕉久久夜色精品国产使用方法| 中文字幕欧美日本乱码一线二线| 91麻豆精品国产91久久久使用方法| 免费久久久一本精品久久区| 国产精品啊啊啊| 91网站黄www| 成人精品高清在线| 国产精品一区二区免费不卡| 免费人成精品欧美精品| 亚洲午夜久久久久| 亚洲小说春色综合另类电影| 亚洲视频一区在线观看| 国产精品成人一区二区三区夜夜夜 | 欧美日韩国产精品成人| 在线日韩av片| 美女精品在线观看| 亚洲一区精彩视频| 久久国产精品久久w女人spa| 亚洲在线日韩| 美女亚洲精品| 久久久国产精品一区二区中文| 在线综合欧美|