Java两种方法中的varargs

T_0*_*_01 30 java arrays variadic-functions

在java中有没有办法创建一个方法,期待两种不同的变量?我知道,由于编译器不知道从哪里开始或结束,因此使用相同的对象类型是不可能的.但为什么它也不可能与不同的对象类型?

例如:

public void doSomething(String... s, int... i){
    //...
    //...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法创建这样的方法?谢谢!

rec*_*rec 34

只有一个vararg,对不起.但是使用asList()使它几乎同样方便:

 public void myMethod(List<Integer> args1, List<Integer> args2) {
   ...
 }

 -----------

 import static java.util.Arrays.asList;
 myMethod(asList(1,2,3), asList(4,5,6));
Run Code Online (Sandbox Code Playgroud)

  • @WilliamMorrison - 如果您使用实际的引用类型(例如“Integer”)而不是“&lt;?&gt;”,则不需要强制转换。 (2认同)

rge*_*man 17

在Java中,只varargs允许一个参数,它必须是签名的最后一个参数.

但它无论如何都会将它转换为数组,所以你应该让你的两个参数显式数组:

public void doSomething(String[] s, int[] i){
Run Code Online (Sandbox Code Playgroud)

  • 方法签名不能修复数组的大小; 调用者可以传入他们想要的任何大小的数组. (2认同)

Zho*_*gYu 10

一种可能的API设计,其中调用代码看起来像

    doSomething("a", "b").with(1,2);
Run Code Online (Sandbox Code Playgroud)

通过"流畅"的API

public Intermediary doSomething(String... strings)
{
    return new Intermediary(strings);
}

class Intermediary
{
    ...
    public void with(int... ints)
    {
        reallyDoSomething(strings, ints);
    }
}

void reallyDoSomething(String[] strings, int[] ints)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

危险在于程序员忘了打电话 with(...)

    doSomething("a", "b");  // nothing is done
Run Code Online (Sandbox Code Playgroud)

也许这会好一些

    with("a", "b").and(1, 2).doSomething();
Run Code Online (Sandbox Code Playgroud)


Wil*_*son 5

vararg允许一个。这是因为多个vararg参数是不明确的。例如,如果您传入同一个类的两个可变参数会怎样?

public void doSomething(String...args1, String...args2);
Run Code Online (Sandbox Code Playgroud)

args1 在哪里结束,args2 在哪里开始?或者这里有什么更令人困惑的事情。

class SuperClass{}
class ChildClass extends SuperClass{}
public void doSomething(SuperClass...args1, ChildClass...args2);
Run Code Online (Sandbox Code Playgroud)

ChildClass 扩展了 SuperClass,因此它可以合法地存在于 args1 或 args2 中。这种混乱就是为什么只varargs允许一个。

varargs 还必须出现在方法声明的末尾。

只需将特定类型声明为 2 个数组。