2014-09-26 71 views
1

我的項目有一個依賴於Apache的百科全書,DBCP和我們使用的版本1.2.2類實現在一個罐子裏的接口,但不覆蓋的方法

我們使用的公地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或更早版本)進行編譯。在Java 6/JDBC 4.0中引入了Wrapper接口。

當類加載器加載一個實現接口但沒有實現所有新方法的類時,它允許它。當實際調用該方法時,引發NoSuchMethodError(我相信它存根丟失的方法來拋出此異常)。這允許 - 有限 - 向前兼容性:只要該方法實際上未被調用,則實現將起作用。

這也意味着,當你繼承這個類時,它將表現得好像所有方法都已經實現(即使它們不是),只要該類的源不是你的項目的一部分。

+0

+1 thx。好的解釋也是如此 – zencv 2014-11-14 14:21:42

相關問題