2017-08-24 69 views
0

我試圖讓我的頭圍繞這行代碼,這是我今天對面傳來:多鑄造

(int[])((int[])((Object[])((Object[])this.mapping.get(index)))[0]) 

其中mapping是一個向量。

當一個人可以簡單地完成(int [])this.mapping.get(index)假設條目的類型爲int []時,它似乎具有從Object []到int []的多餘的轉換和不必要的轉換。任何人都可以向我解釋爲什麼需要上述表達式?由於

+0

正確的打字和使用泛型將避免地獄,但您提供爲什麼太少上下文來告訴更多。例如,它真的只是'Vector'還是它有一個泛型?它包含什麼? – Tom

+0

它只是一個矢量,據我所知:私人矢量映射=新的矢量();它包含一個int [] – Wajeeh

+0

然後閱讀:[什麼是原始類型,爲什麼我們不應該使用它?](// stackoverflow.com/q/2770321) – Tom

回答

3

由於所有這些括號難以閱讀,這裏是一個對戰:

(int[])((int[])((Object[])((Object[])this.mapping.get(index)))[0]) 
│  │││  │││  │││  │    │  │││ │ 
└─────┘│└─────┘│└────────┘│└────────┘    └─────┘││ │ 
     │  │   └─────────────────────────────────┘│ │ 
     │  └─────────────────────────────────────────────┘ │ 
     └─────────────────────────────────────────────────────────┘ 

爆炸,以示評價的順序:

         this 
             .mapping 
                 index 
               .get( ) 
          ((Object[])      ) 
       ((Object[])         ) 
                   [0] 
     ((int[])             ) 
(int[])               

正如你所看到的,第二個劇組和第二個int[]劇組都是多餘的。

的代碼可以簡化爲:

(int[]) ((Object[]) this.mapping.get(index))[0] 

或者更簡單:

((int[][]) this.mapping.get(index))[0] 

更妙的是,如果mapping被宣佈爲Vector<int[][]>,代碼將僅僅是:

this.mapping.get(index)[0] 
+1

也許添加一個鏈接到原始類型和壓力這種代碼值得監禁嗎?雖然完美的答案! –

+0

@JanezKuhar我們不知道OP使用* raw *類型。它可以是'Vector '或'Vector '。 – Andreas

+1

那麼,我們呢,他在評論中寫道:P。 – Tom

1

讓我們換一換this.mapping.get(index)obj。還可以添加一些練級,以更好地觀察此處發生的情況。因此,而不是

(int[])((int[])((Object[])((Object[])this.mapping.get(index)))[0]) 

,我們可以把它寫成

(int[])(
    (int[])(
     (Object[])(
      (Object[])obj 
     ) 
    )[0] 
); 

部分

 (Object[])(
      (Object[])obj 
     ) 

僅僅是雙鑄造同一類型的,所以我們可以跳過一個(Object[])這讓我們

(int[])(
    (int[])(
     (Object[])obj 
    )[0] 
); 

Next p藝術

(int[])(
     (Object[])obj 
    )[0] 

更混亂。 Precedence order table顯示[]優先於(type)鑄造,所以(type)element[index](type)(element[index])相同,這意味着我們實際上將第一個元素(Object位於索引0)投射到int[]

最後,我們再將int[]轉換爲int[],這是多餘的。

所以你的表情可以減少到(int[])((Object[])this.mapping.get(index))[0](int[])(((Object[])this.mapping.get(index))[0])這可能是很少較少混淆。


爲了使其工作this.mapping.get(index)應該返回Object[]陣列(或其亞型像2D陣列int[][]),其應保持作爲第一元件int[]

所以可以

new int[][]{{1,2},{3,4}}; 

而且像

new Object[]{new int[]{1,2}, "foo"}; 
+0

您正在將第一個元素(在索引0處)從'Object'強制轉換爲'int []',而不是'Object []'強制轉換爲int []'。索引查找後,類型爲「Object」,而不是「Object []」。 – Andreas