張量的協(xié)變和逆變 c#泛型接口的協(xié)變和抗變是什么意思?
c#泛型接口的協(xié)變和抗變是什么意思?“協(xié)變”與“逆變(抗變)”中的“協(xié)”與“逆”表示泛型接口在將類型參數(shù)僅用于輸入或輸出的情況下,其類型參數(shù)的隱式轉(zhuǎn)換所遵循的規(guī)律。協(xié)變當泛型接口類型僅用于輸出(使用關(guān)
c#泛型接口的協(xié)變和抗變是什么意思?
“協(xié)變”與“逆變(抗變)”中的“協(xié)”與“逆”表示泛型接口在將類型參數(shù)僅用于輸入或輸出的情況下,其類型參數(shù)的隱式轉(zhuǎn)換所遵循的規(guī)律。協(xié)變當泛型接口類型僅用于輸出(使用關(guān)鍵詞out),其類型參數(shù)隱式轉(zhuǎn)換所遵循的規(guī)律與對象引用的類型轉(zhuǎn)換規(guī)律相同,稱之為“協(xié)變”逆變當泛型接口類型僅用于輸入(使用關(guān)鍵詞in),其類型參數(shù)隱式轉(zhuǎn)換所遵循的規(guī)律與對象引用的類型轉(zhuǎn)換規(guī)律相反,稱之為“逆變”、“抗變”或“反變”。
Java為什么要有泛型?
java里的泛型是奇葩的存在。這也是我經(jīng)常懟java的一個原因。
先說下泛型的主要作用:
1,強化類型安全,比如定義了一個List<String>,那么里面只能存放String,不允許存放其他類型(派生自String的除外)。類型安全應該在編譯和運行時都能體現(xiàn)。
2,提高性能,減少類型轉(zhuǎn)換和裝箱拆箱次數(shù)。
再說下java泛型奇葩之處:
1,java泛型實現(xiàn)的原理叫類型擦除,不管代碼中怎么定義泛型,編譯后都變成object, 因此不能實現(xiàn)運行時的類型安全。 而且java編譯器不夠聰明,可以很容易騙過去。 舉個例子,你調(diào)用了第三方的接口返回List<String>,但實際拿到的值里面可能跟String沒有半毛錢關(guān)系。
2,既然類型被擦除,那么類型轉(zhuǎn)換就不可避免了,因此使用泛型和非泛型在性能上沒有任何變化。
java怎么獲取一個泛型方法的真實泛型類型?
我認為,如果在方法內(nèi)部獲取還是可行的,但如果希望通過一個方法來獲取一個泛型方法的真實泛型類型,那應該是實現(xiàn)不了。
首先Java中的泛型,也叫參數(shù)化類型,沒記錯泛型應該是jdk5引入的特性,泛型目的在于使數(shù)據(jù)類型可以作為參數(shù)傳入,從而可以動態(tài)的改變某個變量的數(shù)據(jù)類型。
那么什么是泛型方法呢?就是泛型類型是聲明在方法上,只有當調(diào)用該方法時才會將真實類型傳入。如果你是在方法內(nèi)部獲取那直接調(diào)用泛型對象的getClass方法即可。但如果希望通過一方法來獲取某個泛型方法的真實類型,我認為沒法實現(xiàn)。因為未調(diào)用方法時,真實的數(shù)據(jù)類型還未入,所以根本無法取到泛型對應的真實類型。
所以下面我就說說如何在泛型方法內(nèi)部獲取泛型的真實類型。
老規(guī)矩,咱寫段代碼再來解釋。泛型方法的例子如下圖:
在上圖中,我聲明了一個泛型方法:findFirst, 用于獲取數(shù)組的第一個元素。
運行結(jié)果如下圖:
以上就是我的答案,希望對你有所幫助吧
Java為什么不能實現(xiàn)真正泛型?
一句話回答:Java一言九鼎!
Java在發(fā)布之初,就將二進制兼容這個承諾寫入了《Java虛擬機規(guī)范》中,為了兼容Java1.5之前的版本最終選擇了此方案。
雖然兼容的方案不止是擦除這一條路,但是這個承諾確實是導致其沒有采用類似C#那種真泛型的方案的最重要的原因。