首頁  >  文章  >  Java  >  Java中的Object、T(泛型)、?它們的差別

Java中的Object、T(泛型)、?它們的差別

怪我咯
怪我咯原創
2017-06-30 10:40:411304瀏覽

下面小編就為大家帶來一篇詳談Java中的Object、T(泛型)、?差別。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧

因為最近重新看了泛型,又看了些反射,導致我對Object、T(以下代指泛型)、?產生了疑惑。

我們先來試著理解一下Object類別,學習Java的應該都知道Object是所有類別的父類,#注意:那麼這就意味著它的範圍非常廣! 先記住這一點,如果你的參數型別時Object,那麼的參數型別將會非常廣!

《Thinking in Java》中說很多原因促成了泛型的出現,最引人注目的一個原因就是為了創造容器類別。這個要怎麼來理解呢?我的理解是,可以拋開這個為了創造容器類別這個,而是回到泛型的目的是限定某種類型上來。

所以我們現在能小結一下Object和T很重要的兩點差異就是:

Object範圍非常廣,而T從一開始就會限定這個類型(包括它可以限定類型為Object)。

Object由於它是所有類別的父類,所以會強制類型轉換,而T從一開始在編碼時(注意是在寫程式碼時)就限定了某種具體類型,所以它不用強制類型轉換。 (之所以要強調在寫程式碼時是因為泛型在虛擬機中會被JVM擦除掉它的具體類型信息,這點可參考泛型,在這裡不做引申)。

例如在jdk中的List類別是個泛型類別。現在我們制定它的類型是Object。

List<Object> list = new ArrayList<Object>();
int i = 0;
String s = "s";
list.add(i);
list.add(s);

List本身是個泛型類,現在我們指定它接收Object類型的參數,此時就可以放置任意類型的參數進去,而在取出來是就必須得進行強制類型轉換成具體的類型。

現在我們如果將List指定接收String類型的參數,那麼這個List就只能放置String類型,取出來時就不用再強制類型轉換。

這一點帶給我們的啟示是,在寫類似List類別的時候,一定要注意是否用泛型。一定要多寫幾個泛型類,多討論多理解,不然還是可能會攪在一起。

接著是?,這個可能在用到反射需要取得Class型別時用到,它的解釋就是:接收一個不確定的型別,有點跟Object一樣。我對它一個理解是,如果只用"?"那麼它和Object是一樣的,但是"?"有比Object稍微“高級”有點的用法,就是它能縮小一個不確定的範圍,利用類似"? extends Test",這表示只接收到Test類別的繼承類,是不是比Object的範圍縮小了?

以上就是Object、T、?的差別。多寫幾行程式碼,多做試驗,多討論,就知道在何時何地恰當的使用了。

以上是Java中的Object、T(泛型)、?它們的差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn