使用可变参数时的模棱两可的情况
Ambigous situation when using varargs
我有两个方法:
addMsg(字符串摘要,字符串消息,对象...参数)
addMsg(字符串消息,对象...参数)
执行addMsg("str1","str2","str3")?
时会调用哪个
我可以选择使用哪一个吗?
我实际上认为这是对可变参数的误用。
我建议你做的是
addMsg(Integer type, Object... params)
你最好使用不同的变量(整数,正如我所建议的)来区分处理。
Which one will be called when execute addMsg("str1", "str2", "str3") ?
长版本将被称为:
public void addMsg(String summary, String msg, Object... params)
Can I choose which one to be used?
如果您确实无法将方法名称更改为具有意图揭示的名称或通过更改类型来更改签名(例如,您正在处理遗留应用程序),您始终可以通过使用调用短版本反思:
Method hiddenMethod = Arrays.stream(this.getClass().getDeclaredMethods())
.filter(method -> "addMsg".equals(method.getName()))
.filter(method -> method.getParameterTypes().length == 2)
.findFirst()
.orElseThrow(IllegalStateException::new);
Object[] params = { "message" , new String[]{"param1", "param2"}};
hiddenMethod.invoke(this,params);
但是如果可以避免这种情况,请不要这样做。
我有两个方法:
addMsg(字符串摘要,字符串消息,对象...参数)
addMsg(字符串消息,对象...参数)
执行addMsg("str1","str2","str3")?
时会调用哪个我可以选择使用哪一个吗?
我实际上认为这是对可变参数的误用。 我建议你做的是
addMsg(Integer type, Object... params)
你最好使用不同的变量(整数,正如我所建议的)来区分处理。
Which one will be called when execute addMsg("str1", "str2", "str3") ?
长版本将被称为:
public void addMsg(String summary, String msg, Object... params)
Can I choose which one to be used?
如果您确实无法将方法名称更改为具有意图揭示的名称或通过更改类型来更改签名(例如,您正在处理遗留应用程序),您始终可以通过使用调用短版本反思:
Method hiddenMethod = Arrays.stream(this.getClass().getDeclaredMethods())
.filter(method -> "addMsg".equals(method.getName()))
.filter(method -> method.getParameterTypes().length == 2)
.findFirst()
.orElseThrow(IllegalStateException::new);
Object[] params = { "message" , new String[]{"param1", "param2"}};
hiddenMethod.invoke(this,params);
但是如果可以避免这种情况,请不要这样做。