Java 5.0 引入協變返回類型,允許子類重寫父類方法時,返回類型可以是父類方法返回類型的子類型。這打破了早期「返回類型必須完全一致」的限制,讓 API 設計更精確、鏈式調用更流暢。
class Base {
// 父類返回 InputStream
public InputStream getInput() {
return System.in;
}
}
public class Derive extends Base {
@Override
// 子類返回 ByteArrayInputStream(InputStream 的子類)
public ByteArrayInputStream getInput() {
return new ByteArrayInputStream(new byte[1024]);
}
public static void main(String[] args) {
Derive d = new Derive();
System.out.println(d.getInput().getClass()); // 輸出: class java.io.ByteArrayInputStream
}
}
編譯器在字節碼層面生成橋接方法:
ByteArrayInputStream getInput();InputStream getInput() 橋接方法,內部調用真實方法並向上轉型。因此,以父類引用調用時仍能正常工作,且不丟失類型信息。
this 的具體子類型,避免向上轉型後丟失子類方法;Product create(),子類具體化為 ConcreteProduct create(),調用端無需強轉;ArrayList.clone() 返回 ArrayList 而非 Object。@Override 註解讓編譯器把關。協變返回類型是 Java 類型系統向表達力邁出的重要一步,善用它能讓代碼更「說人話」。