隨著jdk的發展,到1.5的時候,引入了泛型(generics
)的概念。由於集合類的廣泛使用,不得不加上一些安全考慮,因為傳統的集合是可以新增任意的型別的資料,我們在取資料的時候,還需要進行手動強制轉型,但是我們並不知道我們取出的資料是什麼型別的,比如:
乙個list
集合,先加入string
,再加入object
,再加入date
,隨著容器的擴大,我們根本分不清當前索引位置的值到底是什麼型別,所以乙個操作不慎,將丟擲型別轉換異常classcastexception
。所以,為了規避這種問題,sun
公司設計了泛型(generics
),目的是再編譯器對**進行檢查,確保集合型別的資料一致性。
泛型的定義
介面定義
public
inte***ce
generices
類定義
public
class
impl
implements
generices
方法定義
public
t get
(class
clz)
泛型約束
泛型有著與物件類似的機制,父子關係,我們可以為我們的泛型定義範圍。
比如使用,表示t必須是類k的子類,或者介面k的實現類。
比如使用,表示t必須是類k的父類,或類k實現的介面。
注意:extends並不表示類的繼承含義,只是表示泛型的範圍關係。
注意:extends中可以指定多個範圍,實行泛型型別檢查約束時,會以最左邊的為準。
泛型擦除
前面提到的,這個檢查只是在編譯時有效,因此在開發工具ide
中,我們寫的集合**不合法都會給出警告提示。實質在執行時這個束縛是會被移除的,這就是所謂的泛型擦除,在編譯結束後,所有的泛型標識都會被刪除。生成原生的object
物件,然後jdk自動幫我們轉成對應的型別。
橋接的由來
由於泛型機制的出現,我們最終編譯的方法將會是object
型別的,我們所呼叫的方法,返回的型別也都是object
型別,這樣明顯不符合重寫方法的概念,我們在方法呼叫時,最終返回的應該是object
型別的物件才對,但是,jdk為我們做了很多輔助的工作,讓我們簡化了這個流程,也就是說,jdk幫我們做了這個轉化工作,將object
型別轉化成實際呼叫的型別,比如list
,那麼object會轉化成string型別。
具體是怎麼由來的呢?,這個就是所謂的橋接(bridge
)方法,jdk在為存在泛型的類,執行完編譯後自動生成的方法,當我們呼叫父類的方法時,會首先呼叫這個橋接方法,然後橋接方法內呼叫子類實現的方法,將對呼叫引數轉型。
舉個栗子:
父類:
public
class
parent
子類:
public
class
children extend parent
public object get
(object o)
}
以上類,代表編譯之後的結果,parent
呼叫children
的get(object o )
方法,再呼叫get(string str)
。所以隨著泛型的產生,也衍生出了@overried
註解,這就是為什麼ide
老是提示我們需要加上這個註解的原因。
橋接的鑑別
在method
類中提供了鑑別是否為橋接方法的工具isbridge
就是來判定,到時是泛型橋接而來,還是原生方法。
qemu 橋接配置方法
參考在 openstack 或在 ubuntu 中配置物理網路 網路用於 kvm 橋接 使用 bond vlan 作為物理網絡卡配置手段 物理機具有 eth0,eth1 兩個網絡卡 eth0,eth1 組成 bond0 使用了 bonding mode4 功能,支援了高可用 bond0.20 是物理...
Java設計模式 橋接模式
橋接模式是一種結構型的設計模式,主要是特點是將抽象部分與實現部分分離開來,從而能夠進行獨自的變化。在橋接模式中,所謂的橋,個人理解是在抽象層中,將介面聯絡到乙個抽象類中,更確切的說,是依賴關係。橋接模式主要適用場景是,某個物件需要從兩個或者多個 一般是兩個 維度進行描述或者操作的時候,能夠簡潔的進行...
java 設計模式之橋接模式
今天看了下設計模式中的橋接模式,發現還是很有趣味的,筆記之。舉個例子,比如gg要約會mm,不同的mm喜歡喜歡不同的地點,比如rose喜歡去電影院,kitty喜歡去西餐廳,而tom,peter 都是gg,他們要分別去約會這兩位mm了,而約會的地點,全部由mm決定 首先是mm介面 package com...