У меня есть класс с перегруженной функцией, и я ожидал, что 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)));
}
}
this
, но типы времени компиляции аргументов. Это известно как однократная отправка. Языки, которые также рассматривают типы аргументов во время выполнения, имеют множественную диспетчеризацию, но в Java такой возможности нет. Смотрите связанный вопрос для более подробной информации. - person John Kugelman   schedule 08.10.2019instanceof
проверки. Не элегантно, но эффектно. - person John Kugelman   schedule 09.10.2019