Как в данном случае идет вызов метода?
Помогите разобраться в работе данного кода
sb.append(agent.toYamlTestCase());
Ссылка на полный документ https://github.com/nielsbasjes/yauaa/blob/master/analyzer/src/main/java/nl/basjes/parse/useragent/debug/AbstractUserAgentAnalyzerTester.java (строка 281)
Вопрос возник из-за того, что agent - это DebugUserAgent и внутри него нет метода toYamlTestCase(), но в коде идет вызов данного метода, как такое может быть?
Для справки toYamlTestCase() находится в совершенно другом классе (UserAgent)
Ответы (1 шт):
Смотрим внимательно на сигнатуру класса
DebugUserAgent extends MutableUserAgent implements UserAgent has default toYamlTestCase
DebugUserAgent реализует интерфейс UserAgent и наследуется от MutableUserAgent
Из этого следует, что реализация toYamlTestCase лежит либо в одном, либо в другом, либо в его предках.
Java это объектно-ориентированный язык и наследование является одним из основных свойств ООП.
Начиная с Java 8 в интерфейсах можно указывать реализацию метода по умолчанию.
Соответственно если в таком интерфейсе указан метод с реализацией по умолчанию, то его необязательно реализовывать в вашем классе.
И если внимательнее присмотреться к сигнатуре то можно увидеть
implements UserAgent has default toYamlTestCase
Что можно прочитать как "реализует интерфейс UserAgent с реализацийе по умолчанию toYamlTestCase"
И если мы перейдем на исходник данного интерфейса - мы можем найти этот метод.
default String toYamlTestCase() {
return toYamlTestCase(false, null);
}
Это и есть искомая реализация.
Ссылка на реализацию toYamlTestCase внутри интерфейса UserAgent:
https://github.com/nielsbasjes/yauaa/blob/59757e9ef86465c7f02aa344db4bfc132d4fe4dd/analyzer/src/main/java/nl/basjes/parse/useragent/UserAgent.java#L240