2013-01-25 70 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(); 
} 
} 
相关问题