我正在學習泛型并且有點困惑。我對使用泛型的類的輸入型別和回傳型別之間的區別感到困惑。
Stack<Integer> even = new Stack<>();
// pushing values in stack
even.push(0);
even.push(2);
System.out.println(even.pop().getClass().getSimpleName());
System.out.println("pop => " even.pop());
我們正在推入 0 和 2 的 int 值。但第一個列印陳述句將列印“整數”。如果堆疊被宣告為 Integer 作為其泛型型別,為什么我們能夠推入原始“int”?如果我們可以推入一個原始的“int”,為什么 pop() 類會回傳一個包裝類“Integer”?
我顯然誤解了一些關于泛型的東西。
uj5u.com熱心網友回復:
發生這種情況是因為稱為自動裝箱。
自動裝箱是 Java 編譯器在原始型別與其對應的物件包裝類之間進行的自動轉換。例如,將 int 轉換為 Integer,將 double 轉換為 Double,等等。如果轉換以另一種方式進行,則稱為拆箱。
最簡單的例子:
Character ch = 'a';
這就是這里發生的事情:
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i = 2)
li.add(i);
編譯器從 i 創建一個 Integer 物件并將該物件添加到串列中。
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i = 2)
li.add(Integer.valueOf(i));
對你來說也是一樣的東西。
uj5u.com熱心網友回復:
您不能將泛型宣告為原始型別,因為它們不是類。它們是其他東西(當然是原始型別)。相反,您使用相應的包裝類。
當您執行 時,會通過該方法push(int)對包裝類進行隱式強制轉換。IntegerInteger#valueOf(int)
stack.push(0);
由編譯器轉換,無需詢問
stack.push(Integer.valueOf(0))
出于同樣的原因,你可以做這樣的事情
Integer n = 3;
并且沒有錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/439480.html
上一篇:如何在顫振中添加圓形圖表?
