一次使用IDEA編寫JDK動態代理Class數組中有關泛型的問題


在一次使用idea工具進行jdk動態代理方法編寫的時候,出現了一個[rawtypes]的編譯錯誤,見下圖:

 

 

 經過多次調試和搜集網上的資料,終於發現了問題的原因:

 

 

 因為jdk動態代理需要傳入一個Class數組,雖然這樣寫Class[] classes = new Class[]{IndexService.class};編輯器不會報錯誤,但是在編譯的時候就會報上面的錯,這是idea的編譯原理導致的,我們需要改成Class<?>[] classes = new Class<?>[]{IndexService.class};就可以順利編譯成功了。

 

 

 運行完結果正常顯示:

 

 

 然后在網上查到idea對數組編譯的一些條件限制,在這里列舉出來。

1 class Gen<T> {}
2 
3 Gen[] g0 = new Gen[10]; //ok
4 Gen<?>[] g1 = new Gen<?>[10]; //ok
5 Gen<Integer>[] g2 = new Gen[10]; //ok 為什么可以?
6 Gen<Integer>[] g3 = new Gen<Integer>[10]; // error, g2可以,為什么g3不行

我們一句句分析編譯器和 IntelliJ IDEA 的行為。

  Gen[] g0 = new Gen[10];

  不會出現編譯錯誤和警告,但 IntelliJ IDEA 會對左側的 Gen[] 報 Raw use of parameterized class 'Gen' 警告。

  第一句沒有問題,是因為 Java 認為這是 raw use of parameterized type,是兼容 1.5 以前沒有泛型的舊語法。當然,現在不推薦這樣寫,失去了用泛型的意義,不利於類型安全。

  Gen<?>[] g1 = new Gen<?>[10];

  沒有編譯錯誤和警告,IDEA 也沒有警告。

 第二句聲明了 Gen<?>[],跟 Gen<Object>[] 基本是一樣的,可以往里面填 Gen<String>,填Gen<Integer> 等等。這種寫法絕大部分時候都沒有意義,
不如直接用 Gen<Object>[]

 Gen<Integer>[] g2 = new Gen[10];
沒有編譯錯誤,有編譯警告:
1 Information:java: /C:/Code/TestJava/src/main/java/cnife/Main.java使用了未經檢查或不安全的操作。 2 Information:java: 有關詳細信息, 請使用 -Xlint:unchecked 重新編譯。

  同時,IDEA 會對右側的 new Gen[10] 報 Unchecked assignment: 'cnife.Gen[]' to 'cnife.Gen<java.lang.Integer>[]' 警告。  

  第三句之所以有警告,是因為 Gen<Integer>[] 聲明的變量有類型參數,因此編譯器啟用了類型檢查,這時候再把 raw type 的 Gen[] 賦給變量就會觸發警告,因為編譯器不能保證 Gen[] 里的每個值都是 Gen<Integer> Gen<Integer>[] g3 = new Gen<Integer>[10];
有編譯錯誤:

Error:(8, 29) java: 創建泛型數組
 
        

    IDEA 對 new Gen<Integer>[10] 報 Generic array creation 錯誤。

 
        
 第四句直接錯誤,在於啟用了類型檢查的編譯器直接禁止創建泛型數組。因為 Java 的泛型是基於擦除實現的,所以不管是 Gen<String>[] 還是 Gen<Integer>[],編譯之后都是 Gen[],編譯器不能保證數組里面存的到底是 Gen<String> 還是 Gen<Integer>,干脆直接禁止創建泛型數組。
 
 


免責聲明!

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



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