我試圖讓我的頭圍繞這行代碼,這是我今天對面傳來:多鑄造
(int[])((int[])((Object[])((Object[])this.mapping.get(index)))[0])
其中mapping
是一個向量。
當一個人可以簡單地完成(int [])this.mapping.get(index)假設條目的類型爲int []時,它似乎具有從Object []到int []的多餘的轉換和不必要的轉換。任何人都可以向我解釋爲什麼需要上述表達式?由於
我試圖讓我的頭圍繞這行代碼,這是我今天對面傳來:多鑄造
(int[])((int[])((Object[])((Object[])this.mapping.get(index)))[0])
其中mapping
是一個向量。
當一個人可以簡單地完成(int [])this.mapping.get(index)假設條目的類型爲int []時,它似乎具有從Object []到int []的多餘的轉換和不必要的轉換。任何人都可以向我解釋爲什麼需要上述表達式?由於
由於所有這些括號難以閱讀,這裏是一個對戰:
(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]
也許添加一個鏈接到原始類型和壓力這種代碼值得監禁嗎?雖然完美的答案! –
@JanezKuhar我們不知道OP使用* raw *類型。它可以是'Vector
那麼,我們呢,他在評論中寫道:P。 – Tom
讓我們換一換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處)從'Object'強制轉換爲'int []',而不是'Object []'強制轉換爲int []'。索引查找後,類型爲「Object」,而不是「Object []」。 – Andreas
正確的打字和使用泛型將避免地獄,但您提供爲什麼太少上下文來告訴更多。例如,它真的只是'Vector'還是它有一個泛型?它包含什麼? – Tom
它只是一個矢量,據我所知:私人矢量映射=新的矢量();它包含一個int [] – Wajeeh
然後閱讀:[什麼是原始類型,爲什麼我們不應該使用它?](// stackoverflow.com/q/2770321) – Tom