假設你有一些庫V1.0集合超:
public class MyCollection {
public void add(String s) {
// add to inner array
}
}
你繼承它以僅接受具有長度爲5字符串:
public class LimitedLengthCollection extends MyCollection {
@Override
public void add(String s) {
if (s.length() == 5) {
super.add(s);
}
}
}
合同,不變該類不會包含長度不爲5的字符串。
現在版本2.0的庫已發佈,並且您將開始使用它。基類修改爲:
public class MyCollection {
public void add(String s) {
// add to inner array
}
public void addMany(String[] s) {
// iterate on each element and add it to inner array
}
}
並且您的子類保持不變。現在您的子類的用戶可以做
LimitedLengthCollection c = new LimitedLengthCollection();
c.addMany(new String[] {"a", "b", "c"});
並且您的子類的合同因此被破壞。它應該只接受長度爲5的字符串,而現在它已經不存在了,因爲在超類中添加了一個額外的方法。
向super *類*添加一個新方法不會導致這樣的編譯時錯誤。事實上,將'default'方法添加到接口中也不會產生編譯時錯誤。 –
如果你正在談論'java.util.Collection',那不是一個超類。這只是一個界面。 – Alderath
如果子類被重新編譯,那麼向超類或接口添加抽象方法是編譯時錯誤,但這可能不會發生。 –