К сожалению, да.
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 ++ во время компиляции.