Почему мой перегруженный метод не использует самый конкретный экземпляр?

У меня есть класс с перегруженной функцией, и я ожидал, что Java будет использовать наиболее конкретную реализацию на основе типа среды выполнения. Однако в приведенной ниже ситуации он всегда вызывает более общий метод. Почему это?

Я добавил комментарии в код, где происходит действие.

/** The entity class inheritance */
public abstract class AbstractHistory { }

public class IndicatorHistory extends AbstractHistory { }


/** The config class inheritance */
public class SynchResourceConfig { }

public class SynchIndicatorSenderConfig extends SynchResourceConfig { }


/** Class with overloaded methods */ 
public class ConfigFilter {

    public boolean shouldProcess(AbstractHistory history, SynchResourceConfig config) {
        logger.info("Using basic filter config");
        return config.isEnabled();
    }

    public boolean shouldProcess(IndicatorHistory history, SynchIndicatorSenderConfig sender) {
        logger.info("Using the Indicator sender config");
        return true;
    }
}

/** Use of the actual method */
private void updateCatalogWithHistoryData(MyType type, SynchResourceSettings senderSettings, long lastId) {
        HistoryDao historyDao = daoService.lookup(type);
        SynchResourceConfig savedConfig = senderSettings.getResources().get(type);

        // The below line always invokes the less specific method
        // (AbstractHistory history, SynchResourceConfig config)
        // even tho, when debugged, it definitely passes objects with runtime values of
        // (IndicatorHistory history, SynchIndicatorSenderConfig sender)
        Predicate<AbstractHistory> filter = (history) -> configFilter.shouldProcess(history, savedConfig);
        historyDao.findById(lastId).filter(filter).forEach(sendRecord(type)));
    }
}

person Cuga    schedule 08.10.2019    source источник
comment
Java рассматривает тип времени выполнения this, но типы времени компиляции аргументов. Это известно как однократная отправка. Языки, которые также рассматривают типы аргументов во время выполнения, имеют множественную диспетчеризацию, но в Java такой возможности нет. Смотрите связанный вопрос для более подробной информации.   -  person John Kugelman    schedule 08.10.2019
comment
Спасибо! Я не понял различия между «этим» и аргументами.   -  person Cuga    schedule 09.10.2019
comment
@JohnKugelman Если вы не возражаете, я спрошу. Можно ли использовать шаблон «Посетитель», когда перегруженные методы зависят от двух разных переменных, как в этой ситуации?   -  person Cuga    schedule 09.10.2019
comment
Хм. Кажется сложным. Простейшим вариантом могут быть просто некоторые базовые instanceof проверки. Не элегантно, но эффектно.   -  person John Kugelman    schedule 09.10.2019
comment
Еще раз спасибо! Обнадеживает то, что это не просто и не только я.   -  person Cuga    schedule 09.10.2019