2017-08-25 71 views
0

我有一定的難度,從Programming Language Pragmatics, by Scott在這個例子中,是否需要拆箱時使用裝箱?

C#和最近的Java版本的理解下面的部分進行自動裝箱和 拆箱操作是避免 包裝語法在很多情況下:

ht.put(13, 31); 
int m = (Integer) ht.get(13); 

這裏Java編譯器創建隱藏的Integer對象來保存值爲13和31的 ,以便它們可以作爲引用傳遞。 仍然需要在返回值上進行整型轉換,以確保 13的哈希表條目確實是一個整數,而不是浮點數字或字符串,例如 。泛型,我們將在 第7.3.1節中考慮,允許程序員聲明僅包含 整數的表。在Java中,這將消除需要投入返回值 的值。在C#中,它將消除對裝箱的需求。

  1. 我想知道這是什麼意思的「整型投在返回 值仍然需要,以確保13 哈希表項實際上是一個整數,而不是,比方說,一個浮點數或 字符串「?請注意,這是用Java編寫的。

    int m = (Integer) ht.get(13);,在拆箱過程中是否使用拳擊(由 (Integer))(轉讓給int)?

    具體來說,(integer)是否將其操作數轉換爲 Integer類的對象?但是其操作數ht.get(13)已經是對象,現在分配需要內置 類型的值int。所以我們不需要從Integerint 這裏的轉換嗎?

  2. Java在 Java中泛型如何「消除需要返回值的值」?

    在C#中,它將如何「消除對拳擊的需求」?

謝謝。

+1

在該示例中,'Hashtable#get'具有返回類型'Object'。這一評論與拳擊無關。 –

+0

謝謝。爲什麼'(Integer)'應用於其返回,如果它的返回已經是'Integer'? – Tim

+1

在泛型世界中,(Integer)類型相當混亂,但這裏的想法是將原始返回類型(Object)轉換爲(Integer),然後將其拆箱爲(int)。 – eckes

回答

4
  1. 沒有對ht的聲明中指定泛型類型的get()返回類型爲Object,所以你必須強制轉換成Integer。然後,Java將自動解除該文件到int

    演員本身不做任何轉換。它只是告訴編譯器將Object視爲Integer。如果該對象實際上不是Integer,則在運行時會出現ClassCastException

  2. 隨着使用泛型類型,ht可能會被宣佈爲Map<Integer, Integer>,所以get()將返回Integer,並投是多餘的。

    在C#中,它可以聲明爲Map<int, int>的Java等效項。 Java不支持原始類型作爲泛型類型參數,因此語法將是非法的。