Class與Class 有何區別呢

1、? 和 Object 差不多,不過還是有差別。
在這種情況下: class<? extends SomeClass> , Object就不能用了

Object是一個具體的類名,而?是一個占位符號,表示任何類型,只要是SomeClass類或者子類就可以。
List<Object>可以放任何類對象
List<? extends InputStream>就只能放InputStream的實現類了。

運行時刻,沒錯,Java的泛型是不存在,所以說,效率沒有任何影響。

2、泛型中使用通配符?代表類型參數可以是任何對象類型,也可以使用extends表示參數類型可以是某類或其子類,參數類型主要是用於解決早期版中集合取數據時的拆箱操作

3、Java中的泛型是個假泛型,僅僅只是在編譯器那邊做了語法檢查而已,和C#里的泛型不一樣的。基本上,不管你在List<>里面寫什么類型,編譯通過了以后運行時全部都是Object。

4、如果方法參數聲明為:
public Page(int start, int totalSize, int pageSize, List<Object> data) {
則構造函數第四個參數傳入List<String>,會編譯報錯。

說明:Java泛型確實是通過類型擦除實現的,編譯器的語法檢查是次要的,重要的是泛型系統可以為我們做更多的類型檢查,這在很多時候是很有幫助的,借助編譯器在編譯期的類型檢查可以減少運行時出現類型錯誤的幾率。

比如foo方法把一個Object對象加入List中,我們期望這個List可以存放任何類型的對象。

如果用原生類型List,就像這個方法,void foo(List list, Object o)

我們可以這么調用foo:

List<Integer> integers = new ArrayList<Integer>();

foo(integers, "bar")

這段代碼是可以編譯通過的,編譯器會有一個警告,但事實上我們並不希望允許這樣調用foo,我們的本意是foo的第一個參數是一個可以存放任何類型對象的List,但integers顯然不是的。

但如果我們的foo方法是這樣子的,void foo(List<Object> list, Object o)

現在如果我們嘗試這樣子調用foo,就會產生編譯錯誤

List<Integer> integers = new ArrayList<Integer>();

foo(integers, "bar")

編譯器的類型檢查讓我們提前發現了問題,而不是等到程序運行拋出異常時才想到,“嘿,你怎么能這么調用foo?”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。