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)
rge*_*man 17
在Java中,只varargs允许一个参数,它必须是签名的最后一个参数.
但它无论如何都会将它转换为数组,所以你应该让你的两个参数显式数组:
public void doSomething(String[] s, int[] i){
Run Code Online (Sandbox Code Playgroud)
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)
只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 个数组。