在面向?qū)ο蟮木幊讨校椒ǖ膮f(xié)變返回類型是在子類中重寫方法時可以用“較窄”類型替換的類型。 一種值得注意的語言是C ++,這是一種相當(dāng)普遍的范例。
C#不支持返回類型協(xié)方差。 自JDK5.0發(fā)布以來,Java語言已經(jīng)(部分)允許協(xié)變返回類型,[1]因此以下示例無法在先前版本上進(jìn)行編譯:
// Classes used as return types: class A { } class B extends A { } // "Class B is more narrow than class A" // Classes demonstrating method overriding: class C { A getFoo() { return new A(); } } class D extends C {//Overriding getFoo() in parent class C B getFoo() { return new B(); } }更具體地說,協(xié)變(從寬到窄)或逆變(從窄到寬)返回類型是指將覆蓋方法的返回類型改變?yōu)榕c原始重寫方法的返回類型相關(guān)(但不同)的類型的情況。。 兩個協(xié)變返回類型之間的關(guān)系通常是允許用Liskov替換原則替換另一個類型的關(guān)系1。 這通常意味著重寫方法的返回類型將是重寫方法的返回類型的子類型。 上面的例子具體說明了這種情況。 如果不允許替換,則返回類型是不變的并導(dǎo)致編譯錯誤。
本詞條內(nèi)容貢獻(xiàn)者為:
王沛 - 副教授、副研究員 - 中國科學(xué)院工程熱物理研究所