在java中重写具有不同返回类型的方法?

在java中重写具有不同返回类型的方法?,java,overloading,overriding,Java,Overloading,Overriding,我读过一本书,它说如果一个方法有相同的签名,我可以重写它。根据这本书,方法的签名是方法\名称+传递的参数 根据这本书,我可以重写具有不同返回类型的方法。在Java中,是否可以用不同的返回类型重写方法?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该相同 根据这本书,它还说,当我们试图用相同的方法名和参数重载一个方法,但返回类型不同时,java会抛出编译错误,因为签名只表示方法名和参数。如果这是真的,我们应该能够重写具有不同返回类型的方法 请帮助我理解这一点。提前谢谢 重写的方

我读过一本书,它说如果一个方法有相同的签名,我可以重写它。根据这本书,方法的签名是方法\名称+传递的参数

根据这本书,我可以重写具有不同返回类型的方法。在Java中,是否可以用不同的返回类型重写方法?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该相同

根据这本书,它还说,当我们试图用相同的方法名和参数重载一个方法,但返回类型不同时,java会抛出编译错误,因为签名只表示方法名和参数。如果这是真的,我们应该能够重写具有不同返回类型的方法

请帮助我理解这一点。提前谢谢

重写的方法可以具有相同的类型或 原始返回类型,称为协变返回


如果将被重写方法的返回类型更改为不是原始类型的子类型的其他类型,则会出现编译时错误。

可以返回其他类型,只要它与被重写方法的返回类型兼容。兼容意味着:它是重写方法返回的类或接口的子类、子接口或实现

这是合乎逻辑的。如果一个方法返回一个Animal,而您的派生类返回一个Cow,那么您并没有违反超类方法的约定,因为Cow是一个Animal。如果派生类返回香蕉,则不再正确,因为香蕉不是动物。

下面是一个示例:

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

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

是的,这是可能的,因为Java5,它被称为协变返回类型。返回类型应该是超类方法返回类型的子类(不允许使用基元类型)。范例

class X implements Cloneable {

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

你的家长班级向外界做出了承诺。例如,方法:

公共价格计算价格(项目[]项)

它告诉全世界期待一个价格

如果您在子类中增强了该功能,您仍然必须保持父类对它的最初承诺

您可以添加重载的计算方法:

公共价格计算价格(项目[]项,整数最小费用)

您甚至可以通过使用更具体的回报类型来改善家长的承诺:

public AccuratePrice calculatePrice(Items[]Items,整数最小费用)

但您必须至少返回您的家长承诺的类型。
方法声明中的异常也是如此。

在Java 5.0中添加了Convariant返回类型,我不太担心Java 6之前的任何问题。Java 6中有一个允许重载返回类型的错误,但Java 7中已经修复了该错误;)可能是@PeterLawrey的复制品还没有找到任何关于它的信息-介意链接到bug吗?为了让答案更完美,请在上面加上标题。尽管香蕉很好吃@这头牛也是,回答得好。当我读到“只要它是兼容的”时,我很生气,并立即问到“兼容意味着什么?”,但你在下一行解释了它=)也许可以添加一些解释。欢迎来到这里。答案应提供额外信息。然而,你的回答对规则施加了人为的限制,JB Nizet已经完整地说明了这一点。你能解释一下为什么我们会出错吗?或者背后的原因是什么?
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;
    }
}
// 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();
}
}