詳談Java中的Object、T(泛型)、?區(qū)別
因為最近重新看了泛型,又看了些反射,導(dǎo)致我對Object、T(以下代指泛型)、?產(chǎn)生了疑惑。
我們先來試著理解一下Object類,學(xué)習(xí)Java的應(yīng)該都知道Object是所有類的父類,注意:那么這就意味著它的范圍非常廣!首先記住這點,如果你的參數(shù)類型時Object,那么的參數(shù)類型將非常廣!
《Thinking in Java》中說很多原因促成了泛型的出現(xiàn),最引人注目的一個原因就是為了創(chuàng)造容器類。這個要怎么來理解呢?我的理解是,可以拋開這個為了創(chuàng)造容器類這個,而是回到泛型的目的是限定某種類型上來。
所以我們現(xiàn)在能小結(jié)一下Object和T很重要的兩點區(qū)別就是:
Object范圍非常廣,而T從一開始就會限定這個類型(包括它可以限定類型為Object)。
Object由于它是所有類的父類,所以會強(qiáng)制類型轉(zhuǎn)換,而T從一開始在編碼時(注意是在寫代碼時)就限定了某種具體類型,所以它不用強(qiáng)制類型轉(zhuǎn)換。(之所以要強(qiáng)調(diào)在寫代碼時是因為泛型在虛擬機(jī)中會被JVM擦除掉它的具體類型信息,這點可參考泛型,在這里不做引申)。
比如在jdk中的List類是個泛型類?,F(xiàn)在我們制定它的類型是Object。
List<Object> list = new ArrayList<Object>(); int i = 0; String s = "s"; list.add(i); list.add(s);
List本身是個泛型類,現(xiàn)在我們指定它接收Object類型的參數(shù),此時就可以放置任意類型的參數(shù)進(jìn)去,而在取出來是就必須得進(jìn)行強(qiáng)制類型轉(zhuǎn)換成具體的類型。
現(xiàn)在我們?nèi)绻麑ist指定接收String類型的參數(shù),那么這個List就只能放置String類型,且取出來時就不用進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
這點給我們帶來的啟示是,在編寫類似List類的時候,一定要注意是否用泛型。一定要多寫幾個泛型類,多討論多理解,不然還是可能會攪在一起。
接著是?,這個可能在用到反射需要獲取Class類型時用到,它的解釋就是:接收一個不確定的類型,有點和Object一樣。我對它一個理解是,如果只用"?"那么它和Object是一樣的,但是"?"有比Object稍微“高級”有點的用法,就是它能縮小一個不確定的范圍,利用類似"? extends Test",這就意味著只接收接收Test類的繼承類,是不是比Object的范圍縮小了?
以上就是Object、T、?的區(qū)別。多寫幾行代碼,多做試驗,多討論,就知道在何時何地恰當(dāng)?shù)氖褂昧恕?/p>
這篇詳談Java中的Object、T(泛型)、?區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Spring的StopWatch實現(xiàn)代碼性能監(jiān)控的方法詳解
在開發(fā)過程中,偶爾還是需要分析代碼的執(zhí)行時間,Spring 框架提供了一個方便的工具類 StopWatch,本文將介紹 StopWatch 的基本用法,并通過示例演示如何在項目中使用 StopWatch 進(jìn)行代碼性能監(jiān)控2023-12-12詳解Java線程編程中的volatile關(guān)鍵字的作用
這篇文章主要介紹了Java線程編程中的volatile關(guān)鍵字的作用,針對其禁止進(jìn)行指令重排序和讀寫內(nèi)存方面著重講解,需要的朋友可以參考下2015-12-12關(guān)于Redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&錯誤的解決方法
這篇文章主要介紹了關(guān)于Redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的解決方法,出現(xiàn)該問題的原因是, redis template向redis存放使用java對象序列化的值,序列化方式和string的一般方式不同,需要的朋友可以參考下2023-08-08Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問題
這篇文章主要介紹了Java中的 BigDecimal 和 String 的相互轉(zhuǎn)換問題,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05