2014-10-01 45 views
-1

我得到了一個帶有可變參數列表的函數。根據類型說明符,所有其他參數具有不同的含義。在具體情況下,除第一個參數外,所有參數都包含字節數組。我想將它們轉換爲二維字節數組:將可變參數列表投射到字節數組

function foo(byte type,Object ...parameters) { 
    ... 
    switch(type) { 
     case 1: short ID=(short) parameters[0]; 
       byte[][] payloads=(byte[][]) Arrays.copyOfRange(parameters,1,parameters.length); //exception here 
       ... 
    } 
    ... 
} 

的主叫用戶呼叫使用

byte[] byteArray1=...; 
byte[] byteArray2=...; 
... 
foo((byte)1,byteArray1,byteArray2,...); 

代碼看起來邏輯和編譯功能,但那裏有一個ClassCastException異常「對象不能轉換爲[ [B「只要我執行代碼就拋出。

如何獲取除第一個參數外的所有參數爲二維字節數組?

+0

對此評論沒有評論,但是該評級是無效? – gorootde 2014-10-02 07:09:49

回答

1

您無法投射數組類型。 short[]不能轉換爲byte[]

不過,我認爲你可以使用泛型來解決問題:

public <T> void foo(T[] ... params) { 
    Class<?> clazz = params[0].getClass(); 
    if (clazz.equals(short[].class)) { 
     //... 
    } else if (...) { 
     //... 
    } else { 
     throw new Exception("expected short[] or int[]"); 
    } 
} 

你不能把clazz到開關,但如果其他的if-else序列會慢一點。

+0

不幸的是,這不是一種解決方案,因爲參數並不都包含相同的類型。正如我的問題所述,第一個參數包含一個short,而其餘的包含字節數組。 – gorootde 2014-10-01 07:02:22

+0

如果是這樣的話,爲什麼不簡單'foo(short [] p1,byte [] ... pn)'?你的問題不清楚。 – Dariusz 2014-10-01 07:16:13

+0

「根據類型說明符,所有其他參數具有不同的含義。」,這不夠清楚嗎?即使是第一個領域也不一定包含短。 – gorootde 2014-10-01 16:21:23