Object的变量参数传递数组不一致

时间:2013-06-16 08:31:11

标签: java arguments variadic-functions

我编写了一个将变量参数作为对象的函数。

当我传入一个大小为1的整数数组,例如{9}时,它将args [0] as和int array []视为int,因此 valueOf 不会产生9. < / p>

但是如果传入2个或更多整数的数组,例如{9,11},那么它将args [0]视为9,将args [1]视为11。 为什么它的行为不同。

请注意,它是针对Android编写的。

protected String[] whereArgs(Object...args) {
    String[] argsStrings = new String[args.length];
    for (int i = 0; i < args.length; i++) {
        if (args[i] instanceof String){
            argsStrings[i] = (String)args[i];
        } else {
            argsStrings[i] = String.valueOf(args[i]);   
        }
    }
    return argsStrings;
}

编辑刚看了一眼我实际上是在两个整体场景中以不同方式传递它们,一个接一个而不是数组,抱歉。

当我传入一个int数组时,为什么不将方法(Object ... args)拆分成一个对象数组,就像方法(int ... args)所发生的那样

所以现在要获取字符串值,我必须单独转换数组类型,例如。 for int [],double []

if (args[0] instanceof int[]){
    argsStrings[0] =  String.valueOf(((int[])args[0])[0]);

有没有办法为任何类型的对象编写它,因为这会导致崩溃

argsStrings[0] = String.valueOf(((Object[])args[0])[0]);

java.lang.ClassCastException:int []无法强制转换为java.lang.Object []

1 个答案:

答案 0 :(得分:2)

如果要传递数组并将每个项目视为方法的'args'参数的单独项,则需要将数组转换为Object []。例如:如果你传入如下所示的整数数组,那就可以做你想做的事。

whereArgs((Object[])(new Integer[]{1, 2}))

原因是编译源时var-arg方法实际上被数组替换。调用方法的所有位置都转换为数组。如果要传递数组以使每个项成为单独的参数..那么您需要使用正确的数组类型。在你的场景中,这将是Object []。这让编译器知道它可以按原样保留方法调用(不将参数放在新对象[]中)