天天看點

java5核心基礎之泛型(3)-泛型作用于編譯階段-如何将String對象傳入Integer類型的泛型對象中?

泛型是作用于編譯階段,在編譯階段控制類型,以確定在編寫代碼的時候隻能傳入指定類型資料到泛型集合對象中去。如何驗證呢,貼代碼如下:

上述code中的輸出語句:

  system.out.println(collection2.getclass()==collection3.getclass());

輸出的結果是true,說明collection2和collection3指向的是同一份位元組碼,雖然在聲明階段指定的類型分别是string和integer。

也就說明,java源程式編譯成class檔案以後,jvm運作程式階段的時候,jvm根本不知道你限定的類型是什麼。這也就更進一步的驗證了前面所說的泛型的類型限定是作用于編譯期間,在運作期間就不起作用了。

那麼我們了解了這個,就可以設想如何透過編譯期,解決在類型限定情況下的非限定類型的值傳入該集合對象,是以我們看下面這個面試題。解決的辦法在上述代碼中已經實作。

  method method=collection3.getclass().getmethod("add",object.class );

通過這句核心代碼我們就得到的就是可以添加任何類型的資料到此集合對象中去。

為什麼?

其實很簡單,因為有類型限定的.java源檔案編譯成class以後,就已經沒有了類型限定。可以了解為泛型的類型限定是作用在編譯期間,一旦編譯成功得到class檔案以後,類型的限定就不複存在。

那麼通過上述的反射方法,我們擷取的正好是class檔案資訊,然後通過反射的getmethod()方法擷取了泛型集合類型的add方法。通過這個方法相當于是透過了編譯階段将string對象傳入到源程式中式integer類型限定的泛型集合對象中。

繼續閱讀