源代碼兼容性和二進制兼容性之間有一個重要的區別。
- 如果V1和V2某些類的兩個版本是二進制兼容的,那意味着根據V1編譯的類對V2運行得很好。
- 如果某些V1和V2類的兩個版本是源代碼兼容的,那意味着一個能夠編譯V1的類將會很好地對V2進行編譯。
源代碼兼容性確實不是自動暗示了二進制兼容性,正如您所經歷的那樣。
編譯源碼時,要調用的特定方法簽名由編譯器決定並存儲在.class
文件中(在本例中爲doSomething(List)
)。
如果更改了類,並且在添加doSomething(Collection)
時刪除了方法doSomething(List)
,則源代碼兼容性被保留(因爲您可以簡單地針對新類編譯相同的代碼),但二進制兼容性會丟失!
Java語言規範有an entire section on binary compatibility。總結:在將方法的參數類型更改爲更一般的類型(通常是)源兼容的情況下,它是而不是二進制兼容的。
如果你想保留的二進制兼容性,那麼改變就必須是這樣的:
public void doSomething(Collection foo) { ... } // original method with changed argument type
public void doSomething(List foo) { // new binary compatibility method, just delegates to original one
doSomething((Collection) foo);
}
MyClass的兩個罐子存在?如果將第二個jar中的類名更改爲MyOtherClass,該怎麼辦?問題是否消失? – 2011-05-12 11:36:52
yes MyClass存在於兩個罐子中。我把它從jar1中,修改它,將它添加到jar2 – Jordan 2011-05-12 12:13:23