2014-09-26 7 views
1

Моего проекта имеет зависимость к Apache Commons-ГСБДУ, и мы используем версию 1.2.2Класса, который реализует интерфейс в банке, но не переопределить методы

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

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

+0

+1 thx. за хорошее объяснение – zencv

Смежные вопросы