Класс, который реализует интерфейс в банке, но не переопределяет методы

Мой проект зависит от 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 брошен (я полагаю, он заглушает отсутствующие методы, чтобы вызвать это исключение). Это допускает ограниченную прямую совместимость: пока этот метод фактически не вызывается, реализация будет работать.

Это также означает, что когда вы создаете подкласс этого класса, он будет вести себя так, как если бы все методы были реализованы (даже если они не были), если источник этого класса не является частью вашего проекта.

Другие вопросы по тегам