【问题标题】:Overriding a method with different return types in java?在java中覆盖具有不同返回类型的方法?
【发布时间】:2013-01-25 10:24:14
【问题描述】:

我读过一本书,它说如果方法具有相同的签名,我可以覆盖它。根据本书,方法的签名是 Method_Name + 传递的参数。

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

根据这本书还说,当我们尝试重载具有相同方法名称和参数但返回类型不同的方法时,java 将引发编译错误,因为签名仅表示方法名称和参数。如果这是真的,我们应该能够覆盖具有不同返回类型的方法。

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

【问题讨论】:

  • 在 Java 5.0 中添加了协变返回类型,我不会太担心 Java 6 之前的任何事情。 Java 6 中存在允许重载返回类型的错误,但这已在 Java 7 中修复;)
  • @PeterLawrey 找不到任何相关信息 - 介意链接到该错误吗?

标签: java overloading overriding


【解决方案1】:

您可以返回不同的类型,只要它与被覆盖方法的返回类型兼容。兼容意味着:它是被覆盖方法返回的类或接口的子类、子接口或实现。

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

【讨论】:

  • 为了让答案更完美,请在标题上加上Liskov Substitution Principle
  • 香蕉很好吃!
  • @AdriaanKoster 奶牛也是。
  • 好答案。当我看到“只要它兼容”时,我很生气,并立即去“兼容是什么意思!?”但你在下一行解释了它=)
【解决方案2】:

您的父类已向外界作出承诺。例如方法:

public Price calculatePrice(Items[] items).

它告诉世界期待价格。

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

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

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

你甚至可以通过使用更具体的返回类型来改进你父母的承诺:

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

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

【讨论】:

    【解决方案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
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      这是一个例子:

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

      【讨论】:

        【解决方案5】:

        您的覆盖方法可以具有相同的类型或子类型 原始返回类型,称为协变返回。

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

        【讨论】:

        • 您能解释一下为什么会出现错误吗?或者背后的原因是什么?
        【解决方案6】:
        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;
            }
        }
        

        【讨论】:

        • 也许可以添加一些解释。
        • 欢迎来到 SO。答案应提供更多信息。但是,您的回答对规则进行了人为限制,JB Nizet 已经完整说明了这一点。
        【解决方案7】:
        // 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();
        }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多