Краткий ответ: ваш метод foo()
возвращается немедленно, а вызов $ajax()
выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.
В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo()
и сохранить результаты в члене этого объекта после завершения асинхронного вызова.
function foo(result) {
$.ajax({
url: '...',
success: function(response) {
result.response = response; // Store the async result
}
});
}
var result = { response: null }; // Object to hold the async result
foo(result); // Returns before the async completes
Обратите внимание, что вызов foo()
] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response
.
Состояние JLS в §8.4.9 Перегрузка :
Итак, в вашем случае:
this
) имеет тип времени компиляции Parent
, и поэтому вызывается метод print(Parent)
. Worker
был подклассом и подкласс будет переопределять этот метод, а экземпляр worker
- этого подкласса, тогда будет вызван переопределенный метод. Двойная отправка не существует на Java. Вы должны имитировать его, например. используя шаблон посетителя . В этом шаблоне, в основном, каждый подкласс реализует метод accept
и вызывает посетителя с this
в качестве аргумента, а this
имеет подкласс типа времени компиляции, поэтому используется перегрузка требуемого метода.
Причина в том, что doJob
реализована в Parent
и не перегружена в Child
. Он передает this
методам print
рабочего, потому что this
относится к типу Parent
, будет вызываться метод Worker::print(Parent)
.
Чтобы Worker::print(Parent)
назвал вас нужным перегрузка doJob
в Child
:
public static class Child extends Parent {
public void doJob(Worker worker) {
System.out.println("from Child: this is " + this.getClass().getName());
worker.print(this);
}
}
В коде выше this.getClass()
в Child
эквивалентно Child.class
.