即使我設置了Long類型的列表,我仍然可以沒有任何錯誤地執行此操作。 我應該知道有什麼潛在的問題嗎?是否有添加原始Int而不是Int對象的風險?
long num = 12L;
List<Long> list = new ArrayList<Long>();
list.add(num)
即使我設置了Long類型的列表,我仍然可以沒有任何錯誤地執行此操作。 我應該知道有什麼潛在的問題嗎?是否有添加原始Int而不是Int對象的風險?
long num = 12L;
List<Long> list = new ArrayList<Long>();
list.add(num)
不可以。原始長度將被自動裝盒成一長。
什麼可能導致問題是逆向操作:
long foo = list.get(0);
這將拆箱長到長,會拋出一個NullPointerException如果null被存儲在列表中。
有沒有我應該知道任何潛在的問題?
不,不會有任何問題。編譯器從Java版本1.5+,將執行自動裝箱在這種情況下將long
文字轉換爲Long
對象。
然而,你應該在執行自動拆箱(從Long
到long
),作爲一個拆箱參考null
將導致NPE
要小心。
例如:
list.add(null);
long val = list.get(0); // NPE will be thrown here.
沒有與此沒有任何問題,因爲(現代的版本),Java可以自動的對象和基本類型之間轉換的情況下像這樣的。這就是所謂的自動裝箱。
沒有問題。在java中有一個叫做Autoboxing
的東西。
這個link會幫助你。
按照JLS -
正如任何Java程序員都知道,你不能把一個int(或其他原始值)到一個集合。集合只能保存對象引用,所以你必須將原始值裝入適當的包裝類(在int情況下爲Integer)。當你把對象從集合中取出時,你得到了你放入的Integer;如果您需要int,則必須使用intValue方法取消Integer。所有這些拳擊和拆箱都是一件痛苦的事情,並且會讓你的代碼混亂不堪。自動裝箱和取消裝箱功能可自動執行此過程,消除疼痛和混亂。
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html - 它幾乎從你要求的東西開始。 –