java泛型的解釋

2021-06-20 00:09:13 字數 1160 閱讀 5420

定義了泛型的限定之後,編譯器會在編譯階段對實現了引數化的型別例項進行檢查,例如:

arraylistal=new arraylist();

al.add(10);

這樣在編譯階段他就會將這個錯誤檢查出來,告訴你add()中的引數應該是string型別的。

後來碰到問題如何向引數化型別為string的集合中新增其他型別的資料。然後是用反射解決的:

al.getclass().getmethod("add",object.class).invoke(al,10);

這樣就可以向剛剛那個引數化型別string的集合中新增integer型的資料了。

通過這個例子可以發現al這個物件他所對應的在記憶體中的載入的型別依然是arraylist.class。

這個我進行了一下驗證發現是的:

system.out.println(al.getclass()==arraylist.class);

輸出結果是true,也就是說宣告的引數化型別為string的型別在記憶體中跟原始型別是同乙個。

integer i=al.get(0);

但是像上面的**提取的時候會發現這個問題,他會在編譯階段就告訴你al.get(0),返回的是乙個string。哪怕我們知道它裡面裝的是乙個integer,

但是通過前面的引數化型別的宣告,編譯器就認定了他存進去的是個string,所以返回的也是乙個string,所以不能用integer型別的變數去接受。

string str=al.get(0);

system.out.println(str);

這樣用乙個string型別的變數去接受了他然後將他列印出來,依然碰到問題,它報告異常:無法從integer轉換到string。這是因為str是乙個string型別,列印的時候呼叫它的tostring()方法,但是這個物件卻是乙個integer的物件,他無法呼叫string的tostring()方法。所以他jvm會將他強制轉換成乙個string的物件,但是他們之間沒有繼承關係,所以出現轉換異常。所以由上我們可以直到,泛型限定的只是在編譯階段,只要能通過編譯,在執行時候的記憶體中,我們可以將那個引數化型別當作object來看待。

如何解釋泛型

面試遇到的問題,當時回答的不是很好,再查詢一些資料後,把自己的心得寫下來 定義 泛型是一種特殊的型別,它把指定型別的工作推遲到客戶端 宣告並例項化類或方法的時候進行。這是泛型的基本定義,泛型可說是自.net 2.0中推出的眾多特性中相當重要的乙個,它解決了原先無法避免的容器操作的裝箱 拆箱問題。和....

JAVA 泛型類,限制泛型和泛型方法

我在學習集合的時候對泛型還不太了解,只是覺得用了泛型之後能向自己的集合裡加入自己指定型別的物件,可以減少資料型別的轉換。那麼,脫離集合後,泛型到底該如何使用。今天碰巧看了一段關於泛型的講解,覺得泛型也沒有自己想象中那麼難,於是將自己的心得分享出來,希望能幫到有需要的人。泛型的知識點大概有 泛型類,限...

泛型與非泛型的區別及詳細解釋

1 簡介 我們都知道陣列是一組具有相同資料型別的資料的集合,在程式中可以儲存資料,但是陣列有乙個缺點,即當其中的元素初始化後,要在程式中動態的給陣列新增,或刪除某個元素是很困難的。那麼如何解決這個問題?net給我們提供了各種集合物件,如arraylist和hashtable。它們都可以很好的進行元素...