Класс, который реализует интерфейс в банке, но не переопределяет методы
Мой проект зависит от apache commons-dbcp, и мы используем версию 1.2.2
Используемая версия commons-dbcp имеет класс org.apache.commons.dbcp.BasicDataSource
который реализует javax.sql.DataSource
который в свою очередь реализует java.sql.Wrapper
, тем не мение BasicDataSource
не реализует методы, определенные в Wrapper
(JDK 1.6.x). Но мой проект, который имеет класс (MyClass
) который расширяется BasicDataSource
компилируется без проблем - я немного озадачен здесь. В IntelliJ я вижу MyClass
как ошибка, хотя.
1 ответ
Этот класс был скомпилирован с более ранней версией javax.sql.DataSource
интерфейс (Java 5 или более ранняя версия). Wrapper
интерфейс был представлен в Java 6 / JDBC 4.0.
Когда загрузчик классов загружает класс, который реализует интерфейс, но не реализует все новые методы, он позволяет это. Когда метод фактически вызывается, NoSuchMethodError
брошен (я полагаю, он заглушает отсутствующие методы, чтобы вызвать это исключение). Это допускает ограниченную прямую совместимость: пока этот метод фактически не вызывается, реализация будет работать.
Это также означает, что когда вы создаете подкласс этого класса, он будет вести себя так, как если бы все методы были реализованы (даже если они не были), если источник этого класса не является частью вашего проекта.