2014-10-01 44 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