【问题标题】:How to call a varargs method with an additional argument from a varargs method如何使用可变参数方法的附加参数调用可变参数方法
【发布时间】:2014-12-04 12:21:47
【问题描述】:

我有一些可变参数系统函数,其中 T 是一些实际类型,例如 String:

sys(T... args)

我想创建自己的函数,委托给系统函数。我的函数也是一个可变参数函数。我想将我的函数的所有参数传递给系统函数,加上一个额外的尾随参数。像这样的:

myfunc(T... args) {
    T myobj = new T();
    sys(args, myobj); // <- of course, here error.
}

我需要如何更改出现错误的行? 现在我只看到一种方法:创建维度为 [args] + 1 的数组并将所有项目复制到新数组中。 但也许还有更简单的方法?

【问题讨论】:

  • @aioobe,实际对象类型,否则,如果我正确,我无法创建 myobj。一些更改第一条消息
  • 这就是我问的原因 ;-)

标签: java delegates variadic-functions


【解决方案1】:

现在我只看到一种方法:创建维度为 [args] + 1 的数组并将所有项目复制到新数组中。

没有更简单的方法。您需要创建一个新数组并将myobj 作为数组的最后一个元素。

String[] args2 = Arrays.copyOf(args, args.length + 1);
args2[args2.length-1] = myobj;
sys(args2);

如果你碰巧依赖于 Apache Commons Lang,你可以这样做

sys(ArrayUtils.add(args, myobj));

或番石榴

sys(ObjectArrays.concat(args, myobj));

【讨论】:

    【解决方案2】:

    如果订单无关,您可以拨打sys()两次:

    T myobj=new T();
    sys(myobj);
    sys(args);
    

    如果您不能使用它,请为您的所有功能切换到集合(例如 LinkedList)。

    【讨论】:

    • 我无法执行此调用,因为 sys 会返回另一个对象作为结果,这取决于输入参数。例如:string.format().
    • 那么您必须复制数组或为所有这些函数使用集合。然后你就可以添加你的新项目了。
    • @brummfondel,您是否建议他修改参数集合?这对调用者不太礼貌(仅当参数是可变集合时才有效)。
    • @aioobe 您可以实现该函数的多种变体,一种使用可变参数,一种使用 List。最后,一个人会打电话给另一个人。但是你会有一个灵活的 API。
    • 我会说这只会使 API 变得混乱。使用 Apache Commons 的库或让调用者处理它。
    【解决方案3】:

    如果你可以使用Guava,那么你可以这样做:

    sys(ObjectArrays.concat(myobj, args))
    

    【讨论】:

      【解决方案4】:

      Java 8 解决方案:

      sys(Stream.concat(Arrays.stream(args), Stream.of(myobj)).toArray(T[]::new));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        • 2012-04-12
        • 2014-07-27
        • 1970-01-01
        相关资源
        最近更新 更多