14

我想知道是否可以在接受 vargs 的方法调用上将 Object 数组解压缩到单独的 Object 中。这个问题与这个问题类似

我有一个像这样的代码:

public class Test {
    public static Object doWork(Object... objects){
        System.out.println(objects.length);
        return objects;
    }

    public static void main(String[] args){
        Object res = doWork("one", "two");
        res = doWork("three", res);
    }
}

我想res在第二次调用中解压对象,以便它接收一个长度为 3 的对象数组,而不是现在的长度 2(其中第二个位置是长度为 2 的对象数组,然后具有所有三个参数)。

在Java中甚至可能吗?


更详细:

通过做

Object res = doWork("one", "two");
res = doWork("three", res);

第二个电话被称为:

doWork( Object[ "three", Object[ "one", "two" ] ] )

我想在哪里:

doWork(Object[ "one", "two", "three" ] )

我知道这可以通过执行以下操作来实现:

public static void main(String[] args){
res = doWork("one", "two");
    List<Object> los = Arrays.asList(res);
    los = new ArrayList<>(los);     // Can't modify an underlying array
    los.add("three");
    res = doWork(los.toArray());
}

但我正在寻找类似unpackLua 内置函数或前面提到的 SO 问题中描述的 Python 方式的东西。


@chancea 和 @Cyrille-ka 给出的两个答案都很好,也解决了问题。可能需要考虑的一个好主意是方法的签名是否可以修改。@cyrille-ka 的答案尊重函数的签名,而 @chancea 没有。但是我认为在大多数情况下,一个简单的包装函数可以写到另一个,所以这不应该是一个问题。另一方面,@chancea 的方式在编程时可能更容易使用(不会出现忘记调用 unpack 函数的错误)。

4

3 回答 3

6

好吧,Java 中没有 Python 或 Lua 的语法糖,但您可以创建自己的unpack方法:

@SafeVarargs
public static <E> Object[] unpack(E... objects) {
    List<Object> list = new ArrayList<Object>();
    for (Object object : objects) {
        if (object instanceof Object[]) {
            list.addAll(Arrays.asList((Object[]) object));
        }
        else{
            list.add(object);
        }
    }

    return list.toArray(new Object[list.size()]);
}

这将返回一个包含所有输入元素的数组,解包。

然后你可以在你的main方法中调用它:

res = doWork(unpack("three", res));

我将此方法设为通用的原因是您可以使用例如String[]数组来调用它,而不会生成警告。由于某种原因,Java 编译器认为这种方法有可能“污染堆”,但事实并非如此,这就是我添加@SafeVarargs注解的原因。

于 2013-07-24T14:49:40.630 回答
1

这并没有实现Unpack解决方案,而是overload method按照我在评论中所说的那样进行。我不知道这是否是你想要的,但我让它工作了,我觉得我会发布这个以供参考。

public class Test {
    public static Object doWork(Object... objects){
        System.out.println(objects.length);
        return objects;
    }

    // this is the method that will concatenate the arrays for you
    public static Object doWork(Object[] objects1, Object... objects2){
        System.out.println(objects1.length + "+" + objects2.length);
        Object[] retval = new Object[objects1.length+objects2.length];
        System.arraycopy(objects1, 0, retval, 0, objects1.length);
        System.arraycopy(objects2, 0, retval, objects1.length, objects2.length);
        return retval;
    }

    public static void main(String[] args){
        Object res = doWork("one", "two");
        res = doWork((Object[])res, "three");
        Object[] res2 = (Object[])res; // = {one, two, three}
    }
}
于 2013-07-24T15:00:41.333 回答
0

尝试以数组的形式返回Object。然后"three"在返回数组的末尾连接。

于 2013-07-24T14:44:41.797 回答