Отправляясь на класс значения в Java, есть ли лучший способ? [Дубликат]

Краткий ответ: ваш метод 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.

16
задан durron597 21 April 2015 в 17:58
поделиться

2 ответа

Состояние JLS в §8.4.9 Перегрузка :

  1. Когда метод вызывается (§15.12), количество фактических аргументов (и любого явного типа аргументы), а во время компиляции используются параметры времени компиляции, чтобы определить подпись метода, который будет вызываться (§15.12.2).
  2. Если метод, который должен быть invoked - это метод экземпляра, фактический метод, который будет вызываться, будет определен во время выполнения, используя динамический поиск метода (§15.12.4).

Итак, в вашем случае:

  1. Аргумент метода (this) имеет тип времени компиляции Parent, и поэтому вызывается метод print(Parent).
  2. Если класс Worker был подклассом и подкласс будет переопределять этот метод, а экземпляр worker - этого подкласса, тогда будет вызван переопределенный метод.

Двойная отправка не существует на Java. Вы должны имитировать его, например. используя шаблон посетителя . В этом шаблоне, в основном, каждый подкласс реализует метод accept и вызывает посетителя с this в качестве аргумента, а this имеет подкласс типа времени компиляции, поэтому используется перегрузка требуемого метода.

23
ответ дан Christian Semrau 24 August 2018 в 09:34
поделиться

Причина в том, что 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.

5
ответ дан rsp 24 August 2018 в 09:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: