class InstrumentX { public void play(int NoteX) { println("InstrumentX.play()"); } }
class WindX extends InstrumentX {
// 參數類型從 int 變為 NoteX 類!
public void play(NoteX n) { println("WindX.play(NoteX n)"); }
}
static void tune(InstrumentX i) { i.play(NoteX.MIDDLE_C); } // 參數是 int
new WindError().tune(new WindX()); // 輸出:InstrumentX.play()
WindX.play(NoteX) 與 InstrumentX.play(int) 參數類型不同 → 重載。編譯器認為程序員有意重載,不報錯。
tune() 參數類型 InstrumentX,調用 play(int)。NoteX.MIDDLE_C(int 型)。InstrumentX.play(int)(基類版本)。WindX.play(NoteX),因簽名不匹配。參數名用小寫開頭(noteX),類名大寫(NoteX)。若遵守規範,play(NoteX noteX) 類型差異一眼可見。
覆寫時嚴格保持方法簽名不變。任何參數類型/個數/順序變更皆為重載,破壞多態。編譯器不會幫你攔截此類邏輯錯誤。