泛型為什么只能是引用類型?


記得前段時時間有個面試體,大致意思就是讓我說明為什么泛型不能使primitive type,也就是java的基礎類型,自己這道題答的並不是太好。

自己思考的是,基礎類型會有默認值,當我們想要表達空值時,我們並不能准確的表達我們的意思,因為基礎類型有默認值,所以Java設計者不允許泛型為基礎類型。  划重點:這是錯誤的理解

 

泛型是java提供的語法糖,它是通過編譯器的提供的希望提高開發效率的新語法。沒有泛型之前,對於通用的方法中的引用類型數據的輸入和輸出都只能采取數據轉換的方式。泛型語法糖的思路就是:通過編譯器保證泛型類型的一致性,並幫助我們強制轉換(編譯器幫我們加了強制轉換,反編譯是可以看到的)。

 

泛型為什么是引用類型:

1.java中所有引用類型都繼承自Object並且基礎數據類型的包裝類型也繼承自Object,這就給了編譯器設計者一種考慮,把T是作為Object而存在,輸出時,通過強制轉換轉換為實際類型。

2.選擇將T作為Ojbect而存在還有一種原因就是Java的兼容性問題,由於Java5之前數組都是以Object聲明的,由於數組類型沒法強制轉換,如果選用Object作為泛型擦除后的類型,就可以避免對集合類庫較大的改動,同時也保持了兼容性。但這樣也使得java中的泛型不是真正的泛型,而是作為語法糖而存在的。

 

為什么不能是基礎數據類型:

1.上面已經說明了泛型擦除后是作為Object而存在的,而基礎數據類型並沒有繼承自Object,所以編譯器不允許將基礎類型聲明為泛型類型。最近版本的編譯器當涉及基礎類型作為泛型參數時,編譯器會自動進行拆箱和裝箱,所以編譯器不會報錯。          其實有了自動轉換功能后,編譯器允許基礎類型也沒什么影響,語法原因而已。

 

public class Main<T> {
    Object[] obj = new Object[10];
    public T add (T t) {
        obj[0] = t;
        return (T)obj[0];
    }

    public static void main(String[] args) {
        Main<Integer> mai = new Main();  //除了這里需要聲明為Integer,其它都工作正常
        int i =  mai.add(1);
        System.out.println(i);
    }
}

 

 

 

 

 

      ============================================================

      || 我是小布,小布又作小步的意思,哪怕小步前行,也希望自己一直堅持下去!||

      ============================================================  


免責聲明!

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



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM