2010-12-20 17 views
2

我有一个方法,它采用以下格式的关键字及其相关参数。你如何使用可变参数来包装一个对象的特定函数[]

public String foo(String key, Object[] parameters) {..} 

我宁愿使用可变参数格式传递参数。我应该怎么做?我试过public String foo(String key, Object... parameters) {..} - 但这似乎与上面给出的方法定义相冲突。

我应该像下面这样做,并将其包装到Object []方法中?

public String foo(String key, Object a) {..} 
public String foo(String key, Object a, Object b) {..}  
public String foo(String key, Object a, Object b, Object c) {..} 

回答

6

现有函数的定义只是改变

public String foo(String key, Object... parameters) {..} 

Java中的可变参数方法的机制是在调用点创建一个数组,并传递给它的语法糖。所以这个方法应该与现有的兼容源代码编译后的类。

the Java documentation on varargs

最终参数的类型后的三个时期表明最后一个参数可以作为阵列作为参数的序列进行传递。

+0

+1这是关键点。 – 2010-12-20 09:57:58

2

给方法的不同的名称:

public String bar(String key, Object... a) { 
    return foo(key, a); 
} 

的名称应该是接近原始一个,可能是指定为什么它存在的原因(但是这可以被记录为好)。我不能更具体地与“富”:) :)

这当然需要如果你不能改变现有的方法签名,例如从第三方类继承。如果你可以改变它 - 改变它。旧的调用仍然有效。

2

public String foo(String key, Object[] parameters)public String foo(String key, Object... parameters)是相同的方法,它们的(“类文件”)签名是等价的。

如果你有一个像

public String foo(String key, Object... parameters) {} 

方法的调用follwing允许:

foo("1", obj1); 
foo("2", obj1, obj2); 
foo("3", new Object[]{obj1, obj2, obj3}); 
+0

*“...是相同的方法,他们的签名是相同的”*呃,真的吗?所以我可以用五个参数调用'public String foo(String key,Object [] parameters'):'foo(“hi”,“does”,“this”,“really”,“work”);'?似乎不太可能。 **编辑**:测试。不,你不能。你不能同时拥有两个,但他们的签名不是*等价的。 – 2010-12-20 09:29:32

+0

@ T.J。 Crowder - 是和不是......在字节代码级别*上,签名是相同的 - 编译器只是添加一些胶水来从参数中创建一个Object [],并将其传递给方法。这就是我*想要*说的。 – 2010-12-20 09:45:06

1

public String foo(String key, Object[] parameters) {..}

public String foo(String key, Object... parameters) {..}相等

+0

不完全。 eclipse编译器不喜欢用可变参数调用非可变参数方法。 – Bozho 2010-12-20 22:23:08

相关问题