В скомпилированных языках разница является абсолютной.
Java:
//early binding:
public create_a_foo(*args) {
return new Foo(args)
}
my_foo = create_a_foo();
//late binding:
public create_something(Class klass, *args) {
klass.new_instance(args)
}
my_foo = create_something(Foo);
В первом примере компилятор может делать всевозможные аккуратные вещи во время компиляции. Во-вторых, вам просто нужно надеяться, что тот, кто использует метод, делает это ответственно. (Разумеется, новые JVM поддерживают структуру Class<? extends Foo> klass
, которая может значительно снизить этот риск.)
Еще одно преимущество заключается в том, что IDE могут ссылаться на определение класса, поскольку оно объявлено именно в этом методе. Вызов create_something (Foo) может быть very удален от определения метода, и если вы посмотрите на определение метода, было бы неплохо увидеть реализацию.
Главным преимуществом позднего связывания является то, что он упрощает такие функции, как инверсия управления, а также некоторые другие применения полиморфизма и утиного набора текста (если ваш язык поддерживает такие вещи).