因為最近看了很多項目底層都使用了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、?的差別。多寫幾行代碼,多做試驗,多讨論,就知道在何時何地恰當的使用了。