3

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

当我传入一个大小为 1 的整数数组(例如 {9})时,它会将 args[0] 视为 int array[] 而不是 int,因此valueOf不会产生 9。

但是如果传入 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;
}

编辑再看看我实际上是在两个整数场景中以不同的方式传递它们,一个一个而不是一个数组,对不起。

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

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

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[]

4

1 回答 1

2

如果您想传递一个数组并将每个项目视为方法的“args”参数的一个单独项目..您需要将您的数组转换为 Object[]。例如:如果你像下面这样传入你的整数数组,它会做你想要的。

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

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

于 2013-06-16T09:37:15.413 回答