2013-01-25 69 views
18

我讀過一本書,它說我可以重寫一個方法,如果它具有相同的簽名。根據這本書,方法的簽名是Method_Name + Parameters傳遞。在java中覆蓋具有不同返回類型的方法?

根據本書,我可以重寫一個具有不同返回類型的方法。實際上是否可以在Java中覆蓋不同返回類型的方法?因爲我在網上做了一些搜索,我發現有人說重寫一個方法的返回類型應該是一樣的。

根據書中的說法,當我們嘗試重載一個方法的方法名和參數相同但返回類型不同時,java會拋出一個編譯錯誤,因爲這個簽名只意味着方法名和參數。如果這是真的,我們應該能夠覆蓋具有不同返回類型的方法。

請幫我理解這一點。提前致謝。

+1

Convariant返回類型,我不會擔心什麼預Java 6的太多。 Java 6中存在一個允許重載返回類型的錯誤,但是這已在Java 7中修復;) –

+0

可能重複[可重寫的方法在返回類型中有所不同?](http://stackoverflow.com/questions/14694852/can-overridden-methods-different-in-return-type) – nbro

回答

25

只要它與重寫的方法的返回類型兼容,就可以返回不同的類型。兼容意味着:它是由重寫方法返回的類或接口的子類,子接口或實現。

這是合乎邏輯的。如果一個方法返回一個Animal,並且你的派生類返回一個Cow,那麼你就不會破壞超類方法的契約,因爲牛是一個動物。如果派生類返回一個香蕉,那是不正確的,因爲香蕉不是動物。

+0

爲了使答案完美,請使用[** Liskov替代原則**](http://en.wikipedia.org/wiki/Liskov_substitution_principle)加以標註。 – phineas

+5

雖然香蕉的味道很好吃! –

+1

@AdriaanKoster牛也是如此。 – Prakash

1

您的重寫方法可以具有相同類型或 原始返回類型的子類型,稱爲協變返回。

如果您將overriden方法的返回類型更改爲不是原始類型的子類型的其他類型,那麼您將收到編譯時錯誤。

+0

你能解釋我們爲什麼會出錯嗎?或背後的原因是什麼? – UnKnown

1

下面是一個例子:

class Base { 
    public Number test() { 
     return 0; 
    } 
} 

class A extends Base { 
    public Long test() { 
     return 1L; 
    } 
} 
3

是的,這是可能的,因爲Java 5的,它被稱爲協變返回類型。返回類型應該是超類方法返回類型的子類(不允許基本類型)。示例

class X implements Cloneable { 

    @Override 
    protected X clone() { 
     try { 
      return (X) super.clone(); 
     } catch (CloneNotSupportedException e) { 
      throw new Error(e); // can never happen 
     } 
    } 
} 
11

您的父母班級已向外界作出承諾。例如,方法:

public Price calculatePrice(Items[] items)

它告訴世界期待一個價格。

如果你在你的子類中增強了這個功能,你仍然需要保留父類的原始承諾。

您可以添加計算的重載方法:

public Price calculatePrice(Items[] items, Integer minimumCharge)

,您甚至可以提高使用更具體的返回類型你父母的承諾:

public AccuratePrice calculatePrice(Items[] items, Integer minimumCharge)

但是,您必須至少返回父母所承諾的類型。 方法聲明中的異常也是如此。在Java 5.0中加入

0
Yes we can override different return types but they should be subclass. 

public class Shape { 
    public Shape area(Integer i) { 
     System.out.println("Sape Area"); 
     System.out.println("Integer"); 
     return null; 
    } 
} 


package com.oops; 

public class Circle extends Shape { 
    public Circle area(Integer i) { 
     System.out.println("Circle Area"); 
     System.out.println("int"); 
     return null; 
    } 
} 
+0

也許補充說明。 – DaGardner

+0

歡迎來到SO。答案應該提供額外的信息。然而,您的答案對規則進行了人爲限制,已經由JB Nizet完全陳述了。 – IInspectable

0
// Covariant Overriding 
public class Parent { 

    public Parent(){} 
    String parentName; 
    public Parent(String parentName){ 
    this.parentName=parentName; 
    System.out.println(this.parentName); 
} 

public Parent show(){ 
    return new Parent("Parent"); 
} 
} 




public class Child extends Parent{ 

    public Child(){} 
    String name; 
    public Child(String name){ 
    this.name=name; 
    System.out.println(this.name); 
    } 
    public Child show(){ 
    return new Child("Child"); 
} 
} 



public class Main { 

public static void main(String[] args) { 
    Parent parent=new Child(); 
    parent.show(); 

    Parent parent1=new Parent(); 
    parent1.show(); 
} 
} 
相關問題