不幸的是,是的。
void MyParameterizedFunction(String param1, int param2, bool param3=false) {}
可以用 Java 1.5 编写为:
void MyParameterizedFunction(String param1, int param2, Boolean... params) {
assert params.length <= 1;
bool param3 = params.length > 0 ? params[0].booleanValue() : false;
}
但是你是否应该取决于你对编译器生成一个
new Boolean[]{}
每次通话。
对于多个可默认参数:
void MyParameterizedFunction(String param1, int param2, bool param3=false, int param4=42) {}
可以用 Java 1.5 编写为:
void MyParameterizedFunction(String param1, int param2, Object... p) {
int l = p.length;
assert l <= 2;
assert l < 1 || Boolean.class.isInstance(p[0]);
assert l < 2 || Integer.class.isInstance(p[1]);
bool param3 = l > 0 && p[0] != null ? ((Boolean)p[0]).booleanValue() : false;
int param4 = l > 1 && p[1] != null ? ((Integer)p[1]).intValue() : 42;
}
这与 C++ 语法相匹配,后者仅允许在参数列表末尾使用默认参数。
除了语法之外,还有一个不同之处在于,它对传递的可默认参数进行运行时类型检查,而 C++ 类型在编译期间检查它们。